小编典典

如何处理SQL中的时间存储

sql

我有一个正在编写的Web应用程序(C#,MSSQL),并且需要在系统中存储记录时存储时间戳。通常,我只是使用SQL和DATETIME函数来完成此操作。但是,服务器所在的时区与我们公司所在的时区不同…并且我们可能会更改为完全不同的时区中的另一台服务器。托管公司不会更改服务器时间以匹配我们的本地时区。(不是我责怪他们,但这是我尝试过的一件事。)

因此,我的问题是,存储记录更新的日期/时间的最佳方法是什么,以及在我们本地时区向用户显示该日期/时间的最佳方法是什么?

我想要最简单的方法,所以只要解决方案易于实现,C#和SQL的组合就可以了。(如果这很重要,我通常的风格是在存储过程中做更多的工作,而在C#中做更少的工作。)

你能给我看一些示例代码吗?谢谢!


阅读 172

收藏
2021-03-17

共1个答案

小编典典

始终将DATETIME数据存储在世界标准时间(UTC或GMT)中

  • 这样可以避免所有时区问题
  • 这避免了夏令时的问题
  • 这使简单的日期数学始终可以工作
  • 这样可以使不同时区的交易保持同步
  • 这样您就可以将数据移到不同时区的另一台服务器上,而不会花大价钱
  • 等“通用”的时间,有意义吗?

C#DateTime提供DateTime.UtcNow和ToLocalTime(),SQL提供GETUTCDATE()。这是一个将UTC转换为本地时间的SQL函数-

-- convert UTC to local time
create FUNCTION [dbo].[udfUtcToLocalTime]
(
    @gmt datetime
)
RETURNS datetime
AS
BEGIN
    DECLARE @dt datetime
    SELECT 
        @dt = dateadd(millisecond,datediff(millisecond,getutcdate(), getdate()),@gmt)
    RETURN @dt
END

例子:

SELECT dbo.udfUtcToLocalTime(someDateTimeField)
FROM someTable
2021-03-17