如何在SQL中处理时间存储

本文关键字:处理 时间 存储 SQL | 更新日期: 2023-09-27 17:48:48

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

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

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

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

如何在SQL中处理时间存储

始终以协调世界时(UTC,又称GMT)存储DATETIME数据

  • 这样可以避免所有时区问题
  • 这样可以避免夏令时问题
  • 这使得简单的日期数学总是可行的
  • 这允许不同时区的事务保持同步
  • 这允许您将数据移动到不同时区的不同服务器,而不会搞砸所有内容
  • 等等。"环球"时间,有意义吗

C#DateTime提供DateTime.UtcNow和ToLocalTime(),SQL提供GEUTCDATE()。这里有一个将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

将UTC时间保存在数据库中,并在每次向用户显示时本地化这些时间

将其存储为UTC时间,然后在客户端预生成时区计算在C#中,对DateTime对象使用.ToUniversalTime()获取UTC时间,将其存储在服务器上,然后使用.ToLocalTime()将其转换回。