Serilog - 日志 table 中的时间戳具有时区,但被 SQL 服务器忽略

Serilog - Timestamp in log table has timezone, but ignored by SQL Server

当我将 TimeStamp 转换为 smalldatetime 时,T-SQL 似乎忽略了时区,因此看起来 +00:00 事件发生在未来。

在 SQL 语句中处理时间戳字段中的时区的正确方法是什么?

示例:

2021-09-16 13:05:00.3432122 +00:00 returns 2021-09-16 13:05:00 转换为 smalldatetime 时,实际发生在 9:05am.

2021-09-16 09:05:08.7375111 -04:00 returns 正确的时间。

SELECT TOP(20) 
    Id, TimeStamp, 
    CAST(TimeStamp AS smalldatetime) AS TimeStampx 
FROM 
    SerilogLogs 
WHERE
    Level = 'Error' 
ORDER BY
    Id DESC;

结果显示 +00:00 时间戳在转换为 smalldatetime 时未调整其时间:https://i.imgur.com/MweCHGt.png

看起来 Timestamp colum 使用 DATETIMEOFFSET 类型。因此,您可能希望在将其转换为 SMALLDATETIME:

之前使用 SWITCHOFFSET 函数
SELECT TOP(20) 
    Id, TimeStamp, 
    CAST(SWITCHOFFSET(TimeStamp, '-04:00') AS smalldatetime) AS TimeStampx 
FROM 
    SerilogLogs 
WHERE
    Level = 'Error' 
ORDER BY
    Id DESC;