2012-06-16 14 views
5

मेरे पास SQL ​​सर्वर 2008 R2 डेटाबेस में कुछ कॉलम हैं जिन्हें मुझे स्थानीय समय (समय क्षेत्र में SQL सर्वर है) में कनवर्ट करने की आवश्यकता है।एसक्यूएल सर्वर: यूटीसी और स्थानीय समय के बीच कनवर्ट करें

मैंने स्टैक ओवरफ्लो पर कुछ समान प्रश्न देखे हैं, लेकिन उत्तर डेलाइट सेविंग टाइम के साथ सही तरीके से काम करने में असफल होते हैं, वे केवल वर्तमान अंतर को ध्यान में रखते हैं और तारीख को ऑफ़सेट करते हैं।

+0

क्या आपको डीएसटी संक्रमण के दौरान समय से निपटना होगा (जहां दो यूटीसी मूल्य एक स्थानीय समय के लिए वैध परिणाम हो सकते हैं)? –

उत्तर

7

मुझे अकेले टी-एसक्यूएल का उपयोग करके ऐसा करने का कोई तरीका नहीं मिला।

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 समय से कन्वर्ट करने के लिए मजबूर किया जा रहा है मैं SQL CLR का उपयोग कर इसे हल।

नोट, कि ये कार्य स्थानीय समय की व्याख्या करते हैं जो सर्वर के लिए स्थानीय है। किसी भी भ्रम से बचने के लिए ग्राहकों और सर्वरों को एक ही समय क्षेत्र में सेट करने की अनुशंसा की जाती है।

+1

आपके इनपुट के लिए धन्यवाद। मेरे मामले में ऐसा कुछ नहीं था जो मुझे एक से अधिक बार करने की ज़रूरत थी, यह उस डेटाबेस में अपग्रेड का हिस्सा था जहां स्थानीय समय का उपयोग किया गया था और मैं अपग्रेड करने के लिए केवल एक स्टैंडअलोन एप्लिकेशन बना रहा था। लेकिन मैंने इसे एक उत्तर के रूप में स्वीकार करना चुना है क्योंकि यह इसके लायक है। – 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

डीएसटी के लिए खाता नहीं है :( –

संबंधित मुद्दे