背景
我有一个场景,我正在计算两个日期之间的差异。虽然增量差是点,但最后的计算引入了60分钟(1小时)的差距。
经过调查和“拔毛”事件后,我发现11月份的DST转换是造成60分钟(1小时)差距的原因。
场景
declare @sdate datetime = '2016-10-29 06:03:00.000PM'
declare @edate datetime = '2016-11-29 11:59:00.000PM'
select
DATEDIFF(HOUR, @sdate, @edate),
DATEDIFF(Minute, @sdate, @edate),
DATEDIFF(Second, @sdate, @edate)问题
最后,我只需要返回@sdate和@edate变量之间的秒数或分钟数。我知道一年中会有两次,差异值将减少60分钟(1小时),加或减,并希望在我的sql语句中说明已知的差异。
如果可能的话,我如何在基于集合的操作中说明DST的调整?
目前,我得到的是44996的差异,但这是调整后的时间变化的差异.我正在寻找45056,这是调整后的时间变化差异.
发布于 2016-12-03 21:50:17
Server中的datetime类型不知道时区或与UTC相距。为了考虑DST,您需要使用datetimeoffset类型。
declare @sdate datetimeoffset = '2016-10-29 06:03:00.000PM -05:00'
declare @edate datetimeoffset = '2016-11-29 11:59:00.000PM -06:00'
select
DATEDIFF(Hour, @sdate, @edate),
DATEDIFF(Minute, @sdate, @edate),
DATEDIFF(Second, @sdate, @edate)这将给出您所要求的结果,同时考虑到开始和结束的偏移量相差一个小时。
棘手的部分是如何确定偏移开始。如果您正在运行SQL2016或Azure,则可以使用AT TIME ZONE函数来确定它。
declare @dt datetime = '2016-10-29 06:03:00.000PM'
declare @dto = @dt AT TIME ZONE 'Central Standard Time'但是,既然您说您正在运行SQL 2012,那么您必须编写自己的函数来理解DST何时在您的时区中启动和结束,或者您可以使用我的Server时区支持包来这样做:
declare @dt datetime = '2016-10-29 06:03:00.000PM'
declare @tz varchar = 'America/Chicago'
declare @dto = Tzdb.SwitchZone(Tzdb.LocalToUtc(@dt, @tz, 1, 1), @tz)注意,有一个开放的项目将其简化为单个函数,但上面的内容目前应该有效。
https://stackoverflow.com/questions/40935283
复制相似问题