如何修复有时缺少偏移量的 SQL table order-by DateTimeOffset
How to fix a SQL table order-by DateTimeOffset with the offset sometimes missing
我有一个乱七八糟的 table,其中充满了有时会得到 DateTime 的事件,而在其他地方,DateTimeOffset 分配给了 Date 字段,类似于此(前提是你住在离 Divided 足够远的地方王国经度):
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 中的切换时刻,但现在我正在寻找一种非破坏性(只读)解决方案来按日期排序行
在发布之前找到答案:通过转换为 datetime2(7)
:
去除偏移量
SELECT [MOMENT],
[PAYLOAD],
CONVERT(datetime2(7),[MOMENT]) AS FIXED
FROM @MY_LOG ORDER BY FIXED ASC;
结果是正确排序的 table(夏令时切换时每年两小时除外)。
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
我有一个乱七八糟的 table,其中充满了有时会得到 DateTime 的事件,而在其他地方,DateTimeOffset 分配给了 Date 字段,类似于此(前提是你住在离 Divided 足够远的地方王国经度):
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 中的切换时刻,但现在我正在寻找一种非破坏性(只读)解决方案来按日期排序行
在发布之前找到答案:通过转换为 datetime2(7)
:
SELECT [MOMENT],
[PAYLOAD],
CONVERT(datetime2(7),[MOMENT]) AS FIXED
FROM @MY_LOG ORDER BY FIXED ASC;
结果是正确排序的 table(夏令时切换时每年两小时除外)。
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