【问题标题】:Why does GetDate() return tomorrow's date?为什么 GetDate() 返回明天的日期?
【发布时间】:2017-10-09 01:09:25
【问题描述】:

如果我今天(2017 年 10 月 9 日)对 SQL Server 2008 实例执行 select GetDate(),该函数将返回 10/10/2017,即明天的日期。 但是select convert(date, getDate()) 将返回9/10/2017。我不明白为什么。

可能相关:微软文档说

将当前数据库系统时间戳作为日期时间值返回 没有数据库时区偏移。该值来源于 SQL Server 实例所在计算机的操作系统 正在运行。

without the database time zone offset 到底是什么意思?我的 SQL Server 目前处于 GMT+11。

【问题讨论】:

  • 这听起来不正确。你是如何运行这个查询的?可以在 SSMS 中重现吗?
  • 如果解决了,分享解决方案。

标签: sql-server timezone getdate


【解决方案1】:

Try to look out base on given examples here

GetDate() 函数不会检查当前时区,它会为您提供计算机时间。

尝试使用 CURRENT_TIMESTAMP 可能会有所帮助

最好的问候..

【讨论】:

    【解决方案2】:

    尝试使用

    SELECT CURRENT_TIMESTAMP;
    

    SELECT SYSDATETIME();
    

    用于系统日期和时间。

    另外,使用以下方法获取 UTC 和本地时间:

    SELECT GETUTCDATE() As UTCDateTime
    

    还有

    SELECT CONVERT( DATETIME, SWITCHOFFSET(CONVERT(DATETIMEOFFSET, GETUTCDATE()), DATENAME(TzOffset, SYSDATETIMEOFFSET()))) AS LocalDateTime
    

    【讨论】:

    • 我使用最后一个将云托管数据库中保存的 UTC 时间转换为本地时间。请提出更好的建议。
    • 你写的基本上是SYSDATETIMEOFFSET()。但是,如果您说您将使用数据库字段而不是内部 GETUTCDATE(),那么您错误地假设 current 偏移量与当前的偏移量相同该字段中的值。要正确转换,您需要 AT TIME ZONE (SQL 2016+) 或者对于较旧的 SQL,请使用我的 SQL Server Time Zone Support 项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多