首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复有时缺少偏移量的SQL表order-by DateTimeOffset

如何修复有时缺少偏移量的SQL表order-by DateTimeOffset
EN

Stack Overflow用户
提问于 2020-03-31 09:10:57
回答 1查看 200关注 0票数 0

我有一个乱七八糟的表,里面充满了事件,有时会得到一个DateTime,而在其他地方,会有一个DateTimeOffset被分配给Date字段,类似于这样(假设你住的地方离分割王国的经度足够远):

代码语言:javascript
复制
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的结果如下所示:

代码语言:javascript
复制
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来修复它,它添加了丢失的偏移量,但也补偿了它:

代码语言:javascript
复制
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;

结果是:

代码语言:javascript
复制
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中那样的切换时刻,但现在我正在寻找一种非破坏性(只读)的解决方案来按日期对行进行排序

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-31 09:10:57

在发布之前找到了答案:通过转换为datetime2(7)来剥离偏移量

代码语言:javascript
复制
SELECT [MOMENT],
       [PAYLOAD],
       CONVERT(datetime2(7),[MOMENT]) AS FIXED
FROM @MY_LOG ORDER BY FIXED ASC;

结果是一个正确排序的表(除了每年两个小时的夏令时转换)。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60941916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档