gpt4 book ai didi

sql-server-2012 - DateDiff - 夏令时问题

转载 作者:行者123 更新时间:2023-12-04 07:07:18 26 4
gpt4 key购买 nike

背景

我有一个场景,我正在计算两个日期之间的差异。虽然增量差异很明显,但最终计算引入了 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,就是调整后的时差。

最佳答案

SQL 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)

考虑到开始和结束的偏移量相差一个小时,这将给出您要求的结果。

棘手的部分是如何确定开始的偏移量。如果您运行的是 SQL 2016 或 Azure SQL DB,则可以使用 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 在你的时区开始和结束的时间,或者你可以使用我的 SQL Server Time Zone Support包来做到这一点:

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)

注意有 an open item将其简化为单个函数,但以上内容目前应该可以使用。

关于sql-server-2012 - DateDiff - 夏令时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40935283/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com