将UTC时间转换为当地时间或欧盟夏令时

时间:2019-02-15 13:20:32

标签: sql tsql

Select a, b, c, FROM x JOIN y ON x.x=y.x AND x.PlannedDateTime BETWEEN y.FromDateTime and y.ToDateTime

Plannedsate时间是当地时间(例如2018-03-07 14:03:00.000)

FromDateTime是UTC(2018-03-07 14:03:00.000 +01:00)我不知道UTC或欧盟的白天 ToDateTime是UTC(2018-03-07 15:27:00.000 +01:00)我不知道UTC或欧盟的日光

当我按照上述书面查询要求参加这些日期时,我错过了很多记录。我认为由于时间格式不同。

请提前提供任何解决方案

1 个答案:

答案 0 :(得分:0)

如注释中所述,在SQL Server 2016或更高版本中,应使用AT TIME ZONE将datetimeoffset转换为特定时区。要将datetimeoffset转换为服务器的本地时区,首先必须找到它,然后才能使用它:

DECLARE @TimeZone VARCHAR(50)
EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE', 'SYSTEM\CurrentControlSet\Control\TimeZoneInformation', 'TimeZoneKeyName',@TimeZone OUT
SELECT @TimeZone

DECLARE @x DATETIMEOFFSET='2018-03-07 14:03:00.000 +01:00'
SELECT @x AT TIME ZONE @TimeZone

DECLARE @y DATETIMEOFFSET='2018-04-07 14:03:00.000 +01:00'
SELECT @y AT TIME ZONE @TimeZone

在我的计算机(位于罗马尼亚的布加勒斯特,也是欧盟的一部分)上,上述查询返回:

GTB Standard Time
2018-03-07 15:03:00.0000000 +02:00
2018-04-07 16:03:00.0000000 +03:00

如您所见,这考虑到了夏令时,夏令时在指定日期有效或无效。

您可能希望使用特定的时区,而不是服务器的时区(或者由于权限问题而无法使用xp_regread)。