c# - SQL中如何处理时间存储

标签 c# sql time

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

那么,我的问题是,存储记录更新的日期/时间的最佳方式是什么,以及将日期/时间返回给本地时区用户的最佳方式是什么?

我希望以最简单的方式执行此操作,因此只要解决方案易于实现,C# 和 SQL 的组合就可以了。 (如果重要的话,我通常的风格是在存储过程中做更多的工作,在 C# 中做更少的工作。)

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

最佳答案

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

  • 这避免了所有时区问题
  • 这避免了夏令时问题
  • 这允许简单的日期数学始终有效
  • 这允许不同时区的交易保持同步
  • 这允许您将数据移动到不同时区的不同服务器,而不是搞砸一切
  • 等“通用”时间,有意义吗?

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

关于c# - SQL中如何处理时间存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/220405/

相关文章:

sql - 在 "UNION ALL" View 上查询缓慢

c# - MySQL 身份验证方法错误

c# - 如何使用属性将方法作为表达式传递?

c# - OpenCV:.Net C# 中的 src.size() == dst.size() && dst.type() == CV_32FC1 错误

validation - 每个整数都是可能的年份值吗?

python - 将对象类型更改为 datetime64[ns]-pandas

php时间处理NULL为00 :00:00

c# - 如何在 C# 中从 32 位进程运行 64 位进程?

mysql - 使用 SQL 聚合和计算统计信息

MySQL SELECT 记录从特定日期开始不存在