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
由于此报告需要按小时生成,因此即使日期同步,我也需要一些帮助才能使我的日期时间计算正确。
答案 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并且表示与日期或时间无关的数据类型