启用夏令时时如何在 T-SQL 中获取一天的开始和结束?
Posted
技术标签:
【中文标题】启用夏令时时如何在 T-SQL 中获取一天的开始和结束?【英文标题】:How to get the start and end of a day in T-SQL when daylight savings is enabled? 【发布时间】:2019-04-25 15:58:18 【问题描述】:我目前正在编写一个 SQL Server 脚本,我们在该脚本中每天收集过去 'n' 天的聚合数据。为了做到这一点,我们创建了一个临时表,其中包含最后 'n' 天所有天的开始时间和结束时间。代码如下。
DECLARE @Tbl TABLE (Begin DATETIME, End DATETIME)
DECLARE @i INT = 1
DECLARE @begin DATETIME = DATEADD(DD, DATEDIFF(DD, 1, GETDATE()), 0)
DECLARE @end DATETIME = DATEADD(DD, 1, @begin)
WHILE @i <= @n
INSERT INTO @Tbl
SELECT @begin, @end
SET @end = @begin
SET @begin = DATEADD(DAY, -1, @end)
SET @i = @i + 1
END
我们通过调用一个内置函数将这些日期转换为 UTC,该函数按预期正确执行操作,但会为 November 4th 2018 00:00:00
引发错误,因为这不是有效的本地时间。
上述代码的问题在于它生成的日期为开始日期的第 0 小时和结束日期的第 0 小时。尽管由于夏令时,其中一些日期可能不切实际。
例如,如果您考虑巴西时区,则在 11 月 4 日在 00:00:00
到 01:00:00
启用了夏令时,这使得日期 2018-11-04 00:00:00
无法正确转换为 UTC。
是否有任何已知函数可用于传递日期并以当地时间获取当天的有效开始时间和当天的有效结束时间?
【问题讨论】:
您使用的是什么版本的 SQL Server? 我相信你的问题是倒退的。您应该从 UTC 开始,并在显示层转换为本地时间/从本地时间转换。这可能会给您带来不同的困难,但它们应该更容易处理。没有发布答案,因为我真的没有答案。 由于我们需要从他们的时区获取客户数据,我们从本地时间开始,而不是从 UTC 开始。如果我从 UTC 开始,删除每天 24 小时将导致时间设置为 11 月 3 日和 11 月 2 日的 23:00:00。相反,对于 11 月 4 日,计算的差值必须自动为 23 小时,而不是 24 小时。 我们使用的是 Microsoft SQL Server 2012。 我认为你做错了。 2018 年 11 月 4 日 00:00:00 对您无效,但对不遵守夏令时的人完全有效。我会要求完整的日期时间,包括偏移量 (+xx:xx
) 部分,并使用它将日期时间转换为 UTC。
【参考方案1】:
GETUTCDATE()
返回 UTC 日期和时间
【讨论】:
您可以像 GETGETDATE() 一样使用 GETUTCDATE()【参考方案2】:本地时间开始日期和结束日期请使用以下代码
DECLARE @startDate DATETIME, @endDate DATETIME
SET @startDate=DATEFROMPARTS(YEAR(getdate()),MONTH(getdate()),DAY(getdate()))
SET @endDate=getdate()
SELECT @startDate,@endDate
对于 UTC 时间,请将上面代码中的 getdate() 函数替换为 getutcdate()
【讨论】:
以上是关于启用夏令时时如何在 T-SQL 中获取一天的开始和结束?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Dynamics CRM 中获取时区的夏令时开始和结束?