2012-06-16 32 views
5

Tôi có một vài cột trong cơ sở dữ liệu SQL Server 2008 R2 mà tôi cần chuyển đổi từ giờ địa phương (múi giờ máy chủ sql vào) thành UTC.Máy chủ SQL: Chuyển đổi giữa UTC và Giờ địa phương chính xác

Tôi đã thấy một số câu hỏi tương tự trên StackOverflow, nhưng câu trả lời đều không hoạt động chính xác với thời gian tiết kiệm ánh sáng ban ngày, chúng chỉ tính đến sự khác biệt hiện tại và bù đắp ngày tháng.

+0

Bạn có phải đối phó với thời gian từ khi chuyển tiếp DST (trong đó hai giá trị UTC có thể là kết quả hợp lệ cho một giờ địa phương) không? –

Trả lời

7

Tôi không thể tìm thấy bất kỳ cách nào để làm điều này bằng cách sử dụng T-SQL một mình. Tôi giải quyết nó sử dụng 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(); 
    } 
} 

Và kịch bản đăng ký sau:

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; 

Đó là một sự xấu hổ bị buộc phải đi đến nỗ lực như vậy để chuyển đổi đến và đi từ thời gian tính theo giờ UTC.

Lưu ý rằng các chức năng này giải thích giờ địa phương vì mọi thứ đều cục bộ với máy chủ. Chúng tôi đề nghị khách hàng và máy chủ đặt cùng múi giờ để tránh bất kỳ sự nhầm lẫn nào.

+1

Cảm ơn bạn đã nhập. Trong trường hợp của tôi, nó không phải là thứ tôi cần làm nhiều hơn một lần, nó là một phần của việc nâng cấp lên cơ sở dữ liệu mà thời gian địa phương được sử dụng và tôi đã tạo ra một ứng dụng độc lập để thực hiện nâng cấp. Nhưng tôi đã chọn để chấp nhận điều này như một câu trả lời bởi vì nó xứng đáng với nó. – user1450824

1
DECLARE @convertedUTC datetime, @convertedLocal datetime 
    SELECT DATEADD(
        HOUR,         -- Add a number of hours equal to 
        DateDiff(HOUR, GETDATE(), GETUTCDATE()), -- the difference of UTC-MyTime 
        GetDate()        -- to MyTime 
        ) 

    SELECT @convertedUTC = DATEADD(HOUR,DateDiff(HOUR, GETDATE(), GETUTCDATE()),GetDate()) --Assign the above to a var 

    SELECT DATEADD(
        HOUR,         -- Add a number of hours equal to 
        DateDiff(HOUR, GETUTCDATE(),GETDATE()), -- the difference of MyTime-UTC 
        @convertedUTC       -- to MyTime 
        ) 

    SELECT @convertedLocal = DATEADD(HOUR,DateDiff(HOUR, GETUTCDATE(),GETDATE()),GetDate()) --Assign the above to a var 


    /* Do our converted dates match the real dates? */ 
    DECLARE @realUTC datetime = (SELECT GETUTCDATE()) 
    DECLARE @realLocal datetime = (SELECT GetDate()) 

    SELECT 'REAL:', @realUTC AS 'UTC', @realLocal AS 'Local' 
    UNION 
    SELECT 'CONVERTED:', @convertedUTC AS 'UTC', @convertedLocal AS 'Local' 
+1

Không tính đến DST :( –

Các vấn đề liên quan