2013-04-04 59 views
0

荫生成我的团队了一份报告,要求我根据今天的日期选择在SQL Server行(IST区)的过程从不同的时区确定的日期时间过滤器 - SQL

本报告是严格基于我的工作时间(06:00 IST到22:00 IST)。

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

例如,今天的日期是04/04/2013。当我开始在06.00 IST工作时,它相当于(2013年3月4日19:30 CST),当我完成我的工作时(2013年4月4日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

你可以显示一些示例数据以及应该包含哪些行?尝试在UTC和一个时区之间的时区之间转换数据已经足够困难,不必介意在UTC的另一侧添加另一个时区,并且在UTC的另一侧增加一个半小时的时间。 – 2013-04-04 02:30:59

+0

另外考虑到一年中部分时间你的CST数据实际上将在CDT中,所以它将有一个小时不同。您的时区是否遵守与美国中部时间相同的DST规则?这可能会降低一些复杂性,如果你知道你的工作日总是x小时+ y分钟不同,不管DST为何 – 2013-04-04 02:32:17

+0

为什么你会不接受来自唯一一个在三年后对你的问题提出任何意见的人的唯一答案?我不关心这些观点,我真的很好奇你是如何决定解决你当时的问题的,但三年后,突然间没有......如果你的要求发生了变化,那可能是一个新问题;如果在我的解决方案中发现了一些错误或其他问题,评论是一个好的开始。 – 2016-02-02 12:54:14

回答

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规则,那么你将需要调整这个计算依据的日期和规则是不同的。您可能最好使用calendar table

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

+0

谢谢你的回复亚伦。关于“时间戳”专栏,是的,我确实同意你的建议,但是这个专栏是由其他人创建的,并且已经存在了相当长的一段时间。改变现在是一件相当昂贵的事情。当我们创建新表格时,会保持这种想法。 – Dinny 2013-04-04 04:13:48