如何解决SQL表按DateTimeOffset排序有时会缺少偏移量的问题

我有一个凌乱的表,里面充满了有时有一个DateTime的事件,在其他地方有一个分配给Date字段的DateTimeOffset,与此类似(只要您在划分王国的经度之外住得足够远):>

DeclARE @MY_LOG TABLE ([MOMENT] DATETIMEOFFSET,[PAYLOAD] NVARCHAR(200));

INSERT INTO @MY_LOG ([MOMENT],[PAYLOAD]) VALUES (GETDATE(),'first entry')
WAITFOR DELAY '00:00:00.100';
INSERT INTO @MY_LOG ([MOMENT],[PAYLOAD]) VALUES (sysdatetimeOFFSET(),'second entry')
WAITFOR DELAY '00:00:00.100';
INSERT INTO @MY_LOG ([MOMENT],'third entry')
WAITFOR DELAY '00:00:00.100';
INSERT INTO @MY_LOG ([MOMENT],'forth entry')

SELECT [MOMENT],[PAYLOAD] FROM @MY_LOG ORDER BY [MOMENT] ASC;

最后一次选择的结果将是以下示例:

2020-03-31 02:39:10.6779279 +02:00  second entry
2020-03-31 02:39:10.8809259 +02:00  forth entry
2020-03-31 02:39:10.5730000 +00:00  first entry
2020-03-31 02:39:10.7770000 +00:00  third entry

我试图通过使用SWITCHOFFSET来修复它,它既增加了丢失的偏移量,又补偿了它:

SELECT [MOMENT],[PAYLOAD],CASE WHEN DATEPART(tz,[MOMENT])=0 THEN SWITCHOFFSET(MOMENT,'+02:00') ELSE MOMENT END AS FIXED 
FROM @MY_LOG ORDER BY FIXED ASC;

结果是:

2020-03-31 02:39:10.6779279 +02:00  second entry 2020-03-31 02:39:10.6779279 +02:00
2020-03-31 02:39:10.8809259 +02:00  forth entry  2020-03-31 02:39:10.8809259 +02:00
2020-03-31 02:39:10.5730000 +00:00  first entry  2020-03-31 04:39:10.5730000 +02:00
2020-03-31 02:39:10.7770000 +00:00  third entry  2020-03-31 04:39:10.7770000 +02:00

我可能还需要考虑This question中的切换时刻,但是现在我正在寻找一种非破坏性(只读)解决方案来按日期对行进行排序

aa2463 回答:如何解决SQL表按DateTimeOffset排序有时会缺少偏移量的问题

在发布前找到答案:通过转换为datetime2(7)去除偏移量:

SELECT [MOMENT],[PAYLOAD],CONVERT(datetime2(7),[MOMENT]) AS FIXED
FROM @MY_LOG ORDER BY FIXED ASC;

结果是正确排序的表(每年夏令时切换的时间为两个小时除外)。

2020-03-31 03:04:04.3630000 +00:00  first entry  2020-03-31 03:04:04.3630000
2020-03-31 03:04:04.4689375 +02:00  second entry 2020-03-31 03:04:04.4689375
2020-03-31 03:04:04.5670000 +00:00  third entry  2020-03-31 03:04:04.5670000
2020-03-31 03:04:04.6709404 +02:00  forth entry  2020-03-31 03:04:04.6709404
本文链接:https://www.f2er.com/2547010.html

大家都在问