如何使用 SQL 将 Sql Server DateTime 转换为通用时间
Posted
技术标签:
【中文标题】如何使用 SQL 将 Sql Server DateTime 转换为通用时间【英文标题】:How to convert a SqlServer DateTime to universal time using SQL 【发布时间】:2008-10-15 18:09:06 【问题描述】:我有一个数据库,其中包含当前存储在本地时间的 DateTime 字段。即将进行的项目将要求将所有这些日期转换为世界时间。与其编写一个 c# 应用程序将这些时间转换为世界时间,我宁愿使用可用的 sqlserver/sql 功能将这些日期准确地转换为世界时间,所以我只需要一个更新脚本。为了准确起见,转换需要考虑夏令时波动等因素。
【问题讨论】:
【参考方案1】:用户定义函数允许您编写如下所示的 SQL 查询:
SELECT toUTC([MyDateColumn], [MyTimeZoneColumn]) FROM [MyTable]
然后,您可以从服务器返回通用时间,而查询本身没有太多难看的语法。现在,您可以使用类似于 Chris 发布的常规 SQL 来为此构建 UDF,但 SQL Server 2005 及更高版本将允许您使用 CLR(.Net:C# 可选)来构建 UDF。它对日期有更好的支持,并且可以更好地考虑时区和夏令时。
【讨论】:
【参考方案2】:查看 convert 函数和 getutcdate 函数?
http://msdn.microsoft.com/en-us/library/ms187928.aspx
【讨论】:
【参考方案3】:查看this link from CodeProject.com - 它完全符合您的要求:获取日期和时区,将它们传递给 UDF,然后以 UTC 或任何其他时区获取日期。
重要提示:检查那篇文章的 cmets - 作者不允许在某个时间点之后修改文章,并且有用于 cmets 中的 UDF 的代码的更新版本解决了一些在原文代码。
另外重要提示:请勿将其用于查询大型数据集。一次性加载到数据库中,或者返回单行的 UTC 日期(比如用户登录表或你有什么)是非常好的。
如果您想要性能,唯一真正可接受的时区转换方法是使用查找表来处理一年中每个小时的所有可能时区转换,并使用 case 语句来处理年份之间的翻转(即 12 月) 31 - 1 月 1 日,反之亦然。)是的,表很大,但查询性能为零。
【讨论】:
【参考方案4】:SQL 没有为此内置任何东西。
两种方法是C# application
(你提到你不想要)或编写一个非常复杂的更新语句,例如:
UtcDate = DATEADD(hour, CASE WHEN OriginalDate BETWEEN x AND y THEN 4
WHEN OriginalDate BETWEEN x2 AND y2 THEN 5 ... END, OriginalDate)
注意 - 我建议使用 C# app
加上 TZ4Net 之类的东西来处理转换。
【讨论】:
以上是关于如何使用 SQL 将 Sql Server DateTime 转换为通用时间的主要内容,如果未能解决你的问题,请参考以下文章
C# 将 DateTime 转换为 Sql Server 2005 格式
在 F# 中,如何使用 Type Provider 访问 Sql Server Geography 数据类型?