【问题标题】:Getdate() function to get date for my timezoneGetdate() 函数获取我的时区的日期
【发布时间】:2013-11-20 02:29:03
【问题描述】:

我希望在数据类型为 datetime2(7) 的列中插入一个默认值。但是,由于我的网站托管在不同时区的服务器上,因此 getdate 功能无法正常工作。我想知道是否有解决方案。我做了一些研究,发现了两种方法。 首先是使用 GetUTCDate() 函数。但是,我需要在显示信息时进行转换。我确信我的 Web 应用程序仅用于我的时区。所以我想避免这种情况。 第二种方式,这是我可以通过使用 SwitchOffSet 函数完成的最接近的方式:

CREATE TABLE [dbo].[Test_Date](
[test_id] [int] NOT NULL,
[test_date] [datetime2](7) NOT NULL
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Test_Date] ADD  CONSTRAINT [DF_Test_Date_test_date]  DEFAULT (switchoffset(CONVERT([datetimeoffset],getutcdate()),'+13:00')) FOR [test_date]
GO

但是,我的问题是未来几个月的 +13:00 原因,它将是夏令时更改的 +12:00 原因。结果,我每次都需要更改它。有人有解决办法吗?

谢谢。

【问题讨论】:

    标签: sql-server getdate


    【解决方案1】:
    SELECT GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Central Standard Time'
    

    您需要第一个'AT TIME ZONE UTC' 来告诉数据库当前的值是什么,因此它知道如何到达第二个给定时区,在我的示例中为'Central Standard Time'

    【讨论】:

    • 对于 Azure,这是要走的路。
    • @ejcortes 是的,我在写这个答案时在 Azure,所以它是从 Azure SQL Server 的角度来看的。
    • 为什么 Azure 不能足够智能地将 getdate() 转换为 CST?为什么需要先转换为 UTC?
    【解决方案2】:

    你可以使用SYSDATETIMEOFFSET函数

    select SYSDATETIMEOFFSET()
    

    MSDN 说明:

    返回一个 datetimeoffset(7) 值,该值包含运行 SQL Server 实例的计算机的日期和时间。包括时区偏移量。

    更多关于MSDN.


    基于以下评论中的澄清:

    因为要存储客户端的本地时间,SQL Server 无法知道您的本地时间。效果最好的最佳选择是每次都从客户端发送当前时间。

    【讨论】:

    • sysdatetimeoffset() 不能解决我的问题。它会告诉我与 UTC 相比,我的专栏中的时间偏移量是多少。类似于 2007-04-30 13:10:02.0474381 -07:00。这不是我想要达到的。我想为我的时区插入日期和时间。谢谢
    • 实际上,我确实知道我的客户的位置,而且它总是在我的时区。我的网络应用程序不允许从外部进行任何注册。谢谢
    【解决方案3】:

    自 Sql Server 2016 起,您可以使用 AT TIME ZONE...

    SELECT CONVERT(datetime2(0), '2015-03-29T01:01:00', 126)     
    AT TIME ZONE 'Central European Standard Time';  
    

    ...as specified in the documentation

    【讨论】:

    • 但更实际的是,您正在转换一个 DATETIME 值......所以您需要首先给出当前值的“UTC”时区,这样它就知道如何到达下一个。跨度>
    【解决方案4】:
    【解决方案5】:

    由于 db 时区信息与您的 Web 服务器不同,最好将您想要的日期时间值从您的 Web 应用程序显式传递给 db,而不是使用 db 服务器端默认函数。

    【讨论】:

    • 这是最明显的方式。但我尽量避免这种情况。已经写了这么多没有datetime参数的存储过程。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 2020-09-24
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多