存储在 SQL Server DB 中的 DateTime 不考虑夏令时。当我把它拉出来时,我该如何解决这个问题?

Posted

技术标签:

【中文标题】存储在 SQL Server DB 中的 DateTime 不考虑夏令时。当我把它拉出来时,我该如何解决这个问题?【英文标题】:DateTime stored in SQL Server DB does not account for daylight savings time. How can I fix this when I pull it out? 【发布时间】:2018-11-24 16:13:45 【问题描述】:

我无法控制 EST 中的日志日期时间的机器。它不会切换到夏令时。当我提取数据时,它会将我所有的报告都搞砸了一个小时。有没有办法在我的查询中解决这个问题?使用 SQL Server 2014。

【问题讨论】:

问题是当存储了“错误”的时间时,您无法再确定您正在读取的行是在时间更改之前还是之后。您可以在时钟跳过一小时(DST 开始,一小时“丢失”)时修复问题,但不能在时钟倒退一小时时修复(DST 结束,一小时“发生两次”)。如果有另一列像 ID 一样单调增加(或几乎如此),您也许可以解决问题,但即便如此,查询也不会很有趣。 【参考方案1】:

您可以使用 CASE 修复您的查询:

SELECT col1, col2, 
     CASE WHEN (date_col BETWEEN ... AND ...)
            OR (date_col BETWEEN ... AND ...)
            OR (date_col BETWEEN ... AND ...)
          THEN DATEADD(HOUR, 1, date_col) ELSE date_col END AS date_col
FROM tab_name;

我还将更新现有值并修复从应用程序中保存的问题,以避免将来出现这种情况。

【讨论】:

问题是夏令时不是每年的同一天:/ @user1904766 添加更多条件(例如落后和/或未来几年)的问题在哪里?

以上是关于存储在 SQL Server DB 中的 DateTime 不考虑夏令时。当我把它拉出来时,我该如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER2008 存储过程表视图函数的权限

SQL Server 2005 中的内置数据库角色允许执行存储过程?

SQL SERVER 存储过程中如何使用传入的DB参数,实现跨库查询?

使用参数在sql server中的触发器内执行存储过程

Sql Server如何使用date数据类型将日期插入到列中

从 sql server 获取选定的值到 php 中的下拉列表