我有一个乱七八糟的表,里面充满了事件,有时会得到一个DateTime,而在其他地方,会有一个DateTimeOffset被分配给Date字段,类似于这样(假设你住的地方离分割王国的经度足够远):
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],[PAYLOAD]) VALUES (GETDATE(),'third entry')
WAITFOR DELAY '00:00:00.100';
INSERT INTO @MY_LOG ([MOMENT],[PAYLOAD]) VALUES (SYSDATETIMEOFFSET(),'forth entry')
SELECT [MOMENT],[PAYLOAD] FROM @MY_LOG ORDER BY [MOMENT] ASC;最后一次select的结果如下所示:
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中那样的切换时刻,但现在我正在寻找一种非破坏性(只读)的解决方案来按日期对行进行排序
发布于 2020-03-31 09:10:57
在发布之前找到了答案:通过转换为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.6709404https://stackoverflow.com/questions/60941916
复制相似问题