首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DateDiff - DST问题

DateDiff - DST问题
EN

Stack Overflow用户
提问于 2016-12-02 15:08:18
回答 1查看 1.7K关注 0票数 3

背景

我有一个场景,我正在计算两个日期之间的差异。虽然增量差是点,但最后的计算引入了60分钟(1小时)的差距。

经过调查和“拔毛”事件后,我发现11月份的DST转换是造成60分钟(1小时)差距的原因。

场景

代码语言:javascript
复制
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,这是调整后的时间变化差异.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-03 21:50:17

Server中的datetime类型不知道时区或与UTC相距。为了考虑DST,您需要使用datetimeoffset类型。

代码语言:javascript
复制
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函数来确定它。

代码语言:javascript
复制
declare @dt datetime = '2016-10-29 06:03:00.000PM'
declare @dto = @dt AT TIME ZONE 'Central Standard Time'

但是,既然您说您正在运行SQL 2012,那么您必须编写自己的函数来理解DST何时在您的时区中启动和结束,或者您可以使用我的Server时区支持包来这样做:

代码语言:javascript
复制
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)

注意,有一个开放的项目将其简化为单个函数,但上面的内容目前应该有效。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40935283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档