如何在SQL中处理时间存储

时间:2008-10-21 00:28:02

标签: c# sql time

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

所以,我的问题是,存储记录更新日期/时间的最佳方法是什么?在当地时区向用户提供该日期/时间的最佳方式是什么?

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

你能告诉我一些示例代码吗?谢谢!

3 个答案:

答案 0 :(得分:17)

始终将DATETIME数据存储在协调世界时(UTC aka 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

答案 1 :(得分:7)

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

答案 2 :(得分:4)

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