Getdate()函数获取我的时区的日期

问题描述 投票:5回答:5

我想在数据类型为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
5个回答

13
投票

你可以使用SYSDATETIMEOFFSET功能

select SYSDATETIMEOFFSET()

MSDN描述:

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

更多关于MSDN.


根据以下评论中的澄清:

由于您希望存储客户端的本地时间,因此SQL Server无法知道您的本地时间。最好的选择是每次从客户端发送当前时间。


5
投票

从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


1
投票
SELECT GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Central Standard Time'

您需要第一个“AT TIME ZONE UTC”以告知DB当前值是什么,因此它知道如何到达第二个给定时区。


0
投票

由于数据库时区信息与您的Web服务器不同,因此您最好将所需的日期时间值从Web应用程序显式传递到数据库,而不是使用数据库服务器端默认功能。

© www.soinside.com 2019 - 2024. All rights reserved.