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或欧盟的日光
当我按照上述书面查询要求参加这些日期时,我错过了很多记录。我认为由于时间格式不同。
请提前提供任何解决方案
答案 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
)。