Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定来自不同时区的datetime筛选器-SQL_Sql_Sql Server 2008_Tsql - Fatal编程技术网

确定来自不同时区的datetime筛选器-SQL

确定来自不同时区的datetime筛选器-SQL,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,Iam正在为我的团队生成报告,该报告要求我根据今天的日期(IST区域)选择sql server中的行 此报告严格基于我的工作时间(06.00 IST至22.00 IST) 服务器位于美国,其位于CST区域 例如,今天的日期是2013年4月4日。当我在06.00开始工作时,它相当于(04/03/2013 19.30 CST),当我完成工作时,它将是(04/04/2013 11.30 CST) 所以我需要一个过滤器,它允许我根据上述条件过滤记录 注意:我尝试了下面的查询,但当两个时区在同一日期时,查

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

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

服务器位于美国,其位于CST区域

例如,今天的日期是2013年4月4日。当我在06.00开始工作时,它相当于(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

由于此报告需要每小时生成一次,因此我需要一些帮助,以便在日期同步的情况下正确计算日期时间。

如果您遵守与美国中央时间相同的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
对于列名来说是一个非常糟糕的选择,不仅因为它是模糊的,而且因为它是一个数据类型,表示与日期或时间无关的数据类型。

能否显示一些示例数据以及应该包括哪些行?尝试在UTC和一个时区之间转换时区之间的数据是非常困难的,不要介意在UTC的另一侧添加第二个时区,并在上面加上半个小时的时间。还考虑到在一年中的某个时候,CST中的数据实际上将在CDT中,所以这将是一个小时的不同。你所在的时区是否遵守与美国中央时间相同的DST规则?如果你知道你的工作日总是会有x小时+y分钟的不同,那么这可能会降低一些复杂性,不管三年后你为什么不接受唯一一个对你的问题有任何意见的人的唯一答案?我不在乎要点,我真的很好奇你当时是怎么决定用这个解决了你的问题的,但是三年后,突然。。。如果您的需求发生了变化,这可能是一个新问题;如果在我的解决方案中发现了一些bug或其他问题,发表评论是一个好的开始。谢谢你的回复。关于“时间戳”栏,是的,我同意你的建议,但是这个栏是由其他人创建的,已经存在了很长一段时间。现在改变这一点是相当昂贵的事情。我们在创建新表时会记住这一点。