我希望在数据类型为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导致白天节电时间变化的原因。结果,我每次都需要改变它。有人有解决方案吗?
感谢。
答案 0 :(得分:13)
您可以使用SYSDATETIMEOFFSET
功能
select SYSDATETIMEOFFSET()
MSDN说明:
返回datetimeoffset(7)值,该值包含运行SQL Server实例的计算机的日期和时间。包含时区偏移量。
更多关于MSDN.
根据以下评论中的澄清:
因为您想存储客户端的本地时间,所以SQL Server无法知道您的本地时间。最有效的选择是每次从客户端发送当前时间。
答案 1 :(得分:5)
从Sql Server 2016开始,您可以使用AT TIME ZONE
...
SELECT CONVERT(datetime2(0), '2015-03-29T01:01:00', 126)
AT TIME ZONE 'Central European Standard Time';
答案 2 :(得分:3)
只需将数据存储在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?
答案 3 :(得分:0)
由于db时区信息与您的Web服务器不同,因此您最好将所需的日期时间值从Web应用程序显式传递到db,而不是使用db server-side default function。
答案 4 :(得分:0)
def callback(text: Text):
text.delete('1.0', END)
text.insert(END, 'text1\r\n')
text.insert(END, 'text2\r\n')
text.update()
text.insert(END, 'text3\r\n')
text.insert(END, 'text4\r\n')
text.insert(END, 'text5\r\n')
text.insert(END, 'text6\r\n')
text.insert(END, 'text7\r\n')
您需要第一个“ AT TIME ZONE UTC”(AT时区UTC)以告知数据库当前值,因此它知道如何到达第二个给定的时区。