0

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

这份报告严格基于我的工作时间(06.00 IST 到 22.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

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

4

1 回答 1

1

如果您遵守与美国中部时间相同的 DST 规则,因此您的工作日总是从中部时间昨天 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 规则,那么您将需要根据日期和规则不同时调整此计算。您可能最好为此使用日历表

请注意,TIMESTAMP对于列名来说,这是一个非常糟糕的选择,不仅因为它是模糊的,而且因为它是未来的保留关键字,并且表示与日期或时间无关的数据类型。

于 2013-04-04T02:43:10.363 回答