我想在数据类型为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导致白天节能时间变化的原因。结果,我每次都需要改变它。有人有解决方案吗?
谢谢。
只需将数据存储在UTC中,然后使用use a calendar table来计算读数时的偏移量(请参阅以下提示:part 1,part 2,part 3)。有关:
Daylight saving time and time zone best practices
Best Practices working with Datetimeoffset
how to convert all datetime columns in a sql server 2005 express database with data to UTC
Where to set a UTC datetime value in n-tier application: Presentation Layer, Domain, or Database?
你可以使用SYSDATETIMEOFFSET
功能
select SYSDATETIMEOFFSET()
MSDN描述:
返回datetimeoffset(7)值,该值包含运行SQL Server实例的计算机的日期和时间。包括时区偏移。
更多关于MSDN.
根据以下评论中的澄清:
由于您希望存储客户端的本地时间,因此SQL Server无法知道您的本地时间。最好的选择是每次从客户端发送当前时间。
从Sql Server 2016开始你可以使用AT TIME ZONE
...
SELECT CONVERT(datetime2(0), '2015-03-29T01:01:00', 126)
AT TIME ZONE 'Central European Standard Time';
SELECT GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Central Standard Time'
您需要第一个“AT TIME ZONE UTC”以告知DB当前值是什么,因此它知道如何到达第二个给定时区。
由于数据库时区信息与您的Web服务器不同,因此您最好将所需的日期时间值从Web应用程序显式传递到数据库,而不是使用数据库服务器端默认功能。