首页 > 解决方案 > 如何使用数据在 GMT 中的本地时间查询每日计数

问题描述

我需要一个 sql server 查询来获取给定月份的每日行数。我的时间戳存储在 GMT 中,但我的月份需要由客户在本地时间定义。这段代码似乎可以工作,但是太讨厌了,即使使用 EntryDate 作为索引,随着表的增长,它也可能会变得很慢。有没有更简单的方法?客户将位于不同的时区,因此我无法创建额外的列。在此示例中,月/年/时区是硬编码的,但会通过参数传递给执行 SQL 的 C# 代码。

我正在使用 Microsoft SQL Azure (RTM) - 12. 以小时为单位传递偏移量并使用它来偏移日期会更快吗?

select CreateDate=DATEPART(DAY, EntryDate AT TIME ZONE 'Greenwich Standard Time' AT TIME ZONE 'Central Standard Time'), Items=count(1) 
   from TestTable1 
   where year(EntryDate AT TIME ZONE 'Greenwich Standard Time' AT TIME ZONE 'Central Standard Time') = 2018  
     and month(EntryDate AT TIME ZONE 'Central Standard Time' AT TIME ZONE 'Greenwich Standard Time') = 9 
   group by DATEPART(DAY, EntryDate AT TIME ZONE 'Greenwich Standard Time' AT TIME ZONE 'Central Standard Time') 
   order by 1

任何想法表示赞赏!

标签: sql-serverazure-sql-database

解决方案


以下是转换为当地时间的方法。它不包括任何行计数逻辑。

DECLARE @V_UTC_DATETIME DATETIME
  SET @V_UTC_DATETIME='2012-12-03T08:48:52'
  SELECT @V_UTC_DATETIME AS UTC_DATETIME,
DATEADD(hh,((DATEDIFF(ss,@V_UTC_DATETIME,GETDATE())-DATEDIFF(ss,
@V_UTC_DATETIME,GETUTCDATE()))/3600),
@V_UTC_DATETIME) AS LOCAL_DATETIME

推荐阅读