从不同的时区确定日期时间过滤器 - SQL

时间:2013-04-04 02:15:44

标签: sql sql-server-2008 tsql

Iam正在为我的团队生成报告,要求我根据今天的日期(IST区域)在sql server中选择行

此报告严格基于我的工作时间(IST至06.00 IST)。

服务器位于美国及其CST区域。

例如,今天的日期是04/04/2013。当我开始工作于06.00 IST时,相当于(04/03/2013 19.30 CST),当我完成工作时,它将是(04/04/2013 11.30 CST)。

所以我需要的是一个过滤器,它允许我根据上述条件过滤记录。

注意:我尝试了下面的查询,但是当两个时区都在同一个日期时,我的预期不起作用。

DECLARE     @date DATETIME,@startdate DATETIME,@starthour DATETIME
DECLARE    @enddate DATETIME,@endhour DATETIME,@newdate DATETIME  

SET   @date = DATEADD(DAY, DATEDIFF(DAY, 0, getdate()-1), 0)
SET   @starthour = DATEADD(HOUR,19,@date)
set @startdate= DATEADD(MINUTE,30,@starthour)

Set @newdate= DATEADD(DD,1,@date)
SET   @endhour = DATEADD(HOUR,11,@newdate)
set @enddate= DATEADD(MINUTE,30,@endhour)

select @startdate, @enddate
select * from dbo.MyTable where TIMESTAMP Between @startdate and @enddate

由于此报告需要按小时生成,因此即使日期同步,我也需要一些帮助才能使我的日期时间计算正确。

1 个答案:

答案 0 :(得分:1)

如果您遵守与美国中部时间相同的夏令时规则,因此您的工作日总是从中部时间昨天19:30开始,而您的工作日总是16小时,那么您应该是能够做到这一点:

DECLARE @start DATETIME = DATEADD(MINUTE, -270, 
  DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0));

SELECT columns FROM dbo.table
  WHERE [TIMESTAMP] BETWEEN @start AND DATEADD(HOUR, 16, @start);

如果您遵循不同的DST规则,则需要根据日期和规则不同来调整此计算。您可能最好使用calendar table来实现此目的。

请注意,TIMESTAMP对于列名称来说是一个非常糟糕的选择,不仅因为它很模糊,而且因为它是future reserved keyword并且表示与日期或时间无关的数据类型