मैंने बहस की कि क्या इसे पोस्ट करना है क्योंकि यह इस बात पर निर्भर करता है कि SQL सर्वर में बाइनरी स्तर पर दिनांक कैसे संग्रहीत किए जाते हैं, और इसलिए यह एक बहुत ही भंगुर समाधान है। एकबारगी रूपांतरण के अलावा किसी अन्य चीज़ के लिए, मैं उस उत्तर की तरह कुछ उपयोग करूंगा जो @Solution Evangelist ने पोस्ट किया था। फिर भी, आपको यह एक अकादमिक तरीके से दिलचस्प लग सकता है, इसलिए मैं इसे वैसे भी पोस्ट करूँगा।
इस तथ्य का उपयोग करना कि DateTime2
. की सटीकता .NET में टिक अवधि के साथ मेल खाता है और दोनों 01-01-0001 00:00:00.0000000
की प्रारंभिक तिथियों पर आधारित हैं , आप DateTime
. कास्ट कर सकते हैं करने के लिए DateTime2
, और फिर इसे binary(9)
. पर डालें :0x07F06C999F3CB7340B
डेटाटाइम जानकारी RTL संग्रहीत की जाती है, इसलिए उलटते हुए, हमें 0x0B34B73C9F996CF007
मिलेगा ।
पहले तीन बाइट्स 01-01-0001
. के बाद से दिनों की संख्या को स्टोर करते हैं और अगले 5 बाइट्स उस दिन की मध्यरात्रि से 100ns टिक को स्टोर करते हैं, इसलिए हम दिनों की संख्या ले सकते हैं, एक दिन में टिक से गुणा कर सकते हैं और दिन के लिए बीते हुए समय का प्रतिनिधित्व करने वाले टिक जोड़ सकते हैं।
निम्नलिखित कोड निष्पादित करना:
set @date = getdate()
set @ticksPerDay = 864000000000
declare @date2 datetime2 = @date
declare @dateBinary binary(9) = cast(reverse(cast(@date2 as binary(9))) as binary(9))
declare @days bigint = cast(substring(@dateBinary, 1, 3) as bigint)
declare @time bigint = cast(substring(@dateBinary, 4, 5) as bigint)
select @date as [DateTime], @date2 as [DateTime2], @days * @ticksPerDay + @time as [Ticks]
निम्नलिखित परिणाम देता है:
DateTime DateTime2 Ticks
----------------------- ---------------------- --------------------
2011-09-12 07:20:32.587 2011-09-12 07:20:32.58 634514088325870000
टिक्स की लौटाई गई संख्या लेना और .NET में वापस डेटटाइम में कनवर्ट करना:
DateTime dt = new DateTime(634514088325870000);
dt.ToString("yyyy-MM-dd HH:mm:ss.fffffff").Dump();
हमें sql सर्वर से तारीख वापस मिलती है:
2011-09-12 07:20:32.5870000