SQL Server:在 UTC 和本地时间之间精确转换

2023-11-24

我在 SQL Server 2008 R2 数据库中有几列,需要将其从本地时间(SQL Server 所在的时区)转换为 UTC。

我在 StackOverflow 上看到了很多类似的问题,但答案都无法在夏令时下正常工作,它们只考虑当前的差异并抵消日期。


我根本找不到任何方法单独使用 T-SQL 来做到这一点。我使用 SQL CLR 解决了这个问题:

public static class DateTimeFunctions
{
    [SqlFunction(IsDeterministic = true, IsPrecise = true)]
    public static DateTime? ToLocalTime(DateTime? dateTime)
    {
        if (dateTime == null) return null;
        return dateTime.Value.ToLocalTime();
    }

    [SqlFunction(IsDeterministic = true, IsPrecise = true)]
    public static DateTime? ToUniversalTime(DateTime? dateTime)
    {
        if (dateTime == null) return null;
        return dateTime.Value.ToUniversalTime();
    }
}

以及以下注册脚本:

CREATE FUNCTION ToLocalTime(@dateTime DATETIME2) RETURNS DATETIME2 AS EXTERNAL NAME AssemblyName.[AssemblyName.DateTimeFunctions].ToLocalTime; 
GO
CREATE FUNCTION ToUniversalTime(@dateTime DATETIME2) RETURNS DATETIME2 AS EXTERNAL NAME AssemblyName.[AssemblyName.DateTimeFunctions].ToUniversalTime; 

被迫付出如此努力来转换 UTC 时间和从 UTC 时间转换是一种耻辱。

请注意,这些函数解释当地时间就像服务器本地的任何内容一样。建议将客户端和服务器设置为同一时区以避免任何混乱。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server:在 UTC 和本地时间之间精确转换 的相关文章

随机推荐