सभी चार भागों में मेरे अपने प्रश्न का उत्तर देने के लिए कुछ इकाई परीक्षण किए।
###1:क्या SQL सर्वर उसी के अनुसार DateTime.UtcNow को स्टोर करता है, या सर्वर के स्थापित होने के समय क्षेत्र के आधार पर इसे फिर से ऑफ़सेट करता है, और फिर पूछे जाने पर इसे ऑफ़सेट-रिवर्स कर देता है? इसे निष्पादित किया जाता है:
cmd.CommandText = "INSERT INTO testtbl (val) VALUES (@newval)";
cmd.Parameters.Add(new SqlParameter("@newval", DateTime.UtcNow));
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT CAST(val as varchar) value FROM testtbl";
Console.WriteLine(cmd.ExecuteScalar());
इसका परिणाम स्थानीय समयानुसार अपराह्न 1:30 बजे (-7h, या 8:30 PM UTC) था:
Jun 3 2010 8:30PM
फिर मैंने यह कोशिश की:
cmd.CommandText = "INSERT INTO testtbl (val) VALUES (@newval)";
cmd.Parameters.Add(new SqlParameter("@newval", DateTime.UtcNow));
cmd.ExecuteNonQuery();
Console.WriteLine("change time zone to utc");
Console.ReadLine();
cmd.CommandText = "SELECT CAST(val as varchar) value FROM testtbl";
Console.WriteLine(cmd.ExecuteScalar());
Console.WriteLine("change time zone back to local");
9:25 PM UTC पर निष्पादित, यह लौटा
Jun 3 2010 9:25PM
इसकी तुलना डेटटाइम से करें। अभी:
cmd.CommandText = "INSERT INTO testtbl (val) VALUES (@newval)";
cmd.Parameters.Add(new SqlParameter("@newval", DateTime.Now));
cmd.ExecuteNonQuery();
Console.WriteLine("change time zone to utc");
Console.ReadLine();
cmd.CommandText = "SELECT CAST(val as varchar) value FROM testtbl";
Console.WriteLine(cmd.ExecuteScalar());
Console.WriteLine("change time zone back to local");
3:55 बजे निष्पादित (स्थानीय; -7 घंटे), लौटा:
Jun 3 2010 3:55PM
### 2:तो फिर मैं इसके लिए पूछताछ करता हूं और इसे एक आईडीटा रीडर कॉलम से प्राप्त करने के बाद ऑब्जेक्ट से डेटटाइम पर डाल देता हूं। क्या यह सिस्टम को कास्ट करता है। डेटटाइम ऑब्जेक्ट पहले से ही जानता है कि यह यूटीसी डेटटाइम इंस्टेंस है, या क्या यह मानता है कि इसे ऑफ़सेट कर दिया गया है?
न तो।
cmd.CommandText = "INSERT INTO testtbl (val) VALUES (@newval)";
cmd.Parameters.Add(new SqlParameter("@newval", DateTime.UtcNow));
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT val value FROM testtbl";
var retval = (DateTime)cmd.ExecuteScalar();
Console.WriteLine("Kind: " + retval.Kind);
Console.WriteLine("UTC: " + retval.ToUniversalTime().ToString());
Console.WriteLine("Local: " + retval.ToLocalTime().ToString());
इसका परिणाम (स्थानीय समयानुसार दोपहर 1:58 बजे निष्पादित) था:
Kind: Unspecified
UTC: 6/4/2010 3:58:42 AM
Local: 6/3/2010 1:58:42 PM
यानी .ToUniversalTime()
स्थानीय समय से यूटीसी समय में एक बार नहीं बल्कि दो बार (??), और .ToLocalTime()
की भरपाई की। बिल्कुल भी ऑफसेट नहीं हुआ।
###3:क्या ADO.NET ऑफ़सेट को SQL सर्वर में पास करता है और SQL सर्वर डेटटाइम को स्टोर करता है। अब ऑफ़सेट मेटाडेटा के साथ?
कोई भी इकाई परीक्षण किए बिना, उत्तर पहले से ही "केवल DateTimeOffset के साथ" SQL प्रकार के रूप में जाना जाता है। SQL का datetime
ऑफ़सेट नहीं करता है।
###4:क्या यह सिस्टम को कास्ट करता है। डेटटाइम ऑब्जेक्ट पहले से ही जानता है कि यह एक ऑफसेट समय है, या क्या यह मानता है कि यह यूटीसी है?
न। SQL का DateTimeOffset प्रकार .NET DateTimeOffset संरचना के रूप में लौटाया जाता है।
निम्नलिखित को स्थानीय समयानुसार अपराह्न 3:31 बजे निष्पादित किया गया जहां कॉलम offval
एक डेटाटाइमऑफ़सेट SQL प्रकार है,
cmd.CommandText = "INSERT INTO testtbl (offval) VALUES (@newval)";
cmd.Parameters.Add(new SqlParameter("@newval", DateTime.Now));
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT offval value FROM testtbl";
object retvalobj = cmd.ExecuteScalar();
Console.WriteLine("Type: " + retvalobj.GetType().Name);
var retval = (DateTimeOffset)retvalobj;
Console.WriteLine("ToString(): " + retval.ToString());
Console.WriteLine("UTC: " + retval.ToUniversalTime().ToString());
Console.WriteLine("Local: " + retval.ToLocalTime().ToString());
इसका परिणाम यह हुआ:
Type: DateTimeOffset
ToString(): 6/3/2010 3:31:47 PM +00:00
UTC: 6/3/2010 3:31:47 PM +00:00
Local: 6/3/2010 8:31:47 AM -07:00
एक आश्चर्यजनक असमानता।
वापस जाकर ऊपर दिए गए प्रश्न #1 के लिए DateTime.Now के बजाय DateTime.UtcNow का उपयोग करके परीक्षण निष्पादित करना, मैंने पुष्टि की कि ADO.NET डेटाबेस में संग्रहीत करने से पहले सार्वभौमिक समय में परिवर्तित नहीं होता है।
यानी इसे स्थानीय समयानुसार दोपहर 3:27 बजे (-7h) पर अंजाम दिया गया:
cmd.CommandText = "INSERT INTO testtbl (val) VALUES (@newval)";
cmd.Parameters.Add(new SqlParameter("@newval", DateTime.Now));
cmd.ExecuteNonQuery();
Console.WriteLine("change time zone to utc");
Console.ReadLine();
cmd.CommandText = "SELECT CAST(val as varchar) value FROM testtbl";
Console.WriteLine(cmd.ExecuteScalar());
Console.WriteLine("change time zone back to local");
.. लौटा ..
Jun 3 2010 3:27PM
इसे स्थानीय समयानुसार अपराह्न 3:17 बजे निष्पादित करना:
cmd.CommandText = "INSERT INTO testtbl (val) VALUES (@newval)";
cmd.Parameters.Add(new SqlParameter("@newval", DateTime.UtcNow));
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT val FROM testtbl";
var result = (DateTime)cmd.ExecuteScalar();
Console.WriteLine("Kind: " + result.Kind);
Console.WriteLine("ToString(): " + result.ToString());
Console.WriteLine("Add 1 minute, is greater than UtcNow? "
+ (result.AddMinutes(1) > DateTime.UtcNow).ToString());
Console.WriteLine("Add 1 minute, is greater than Now? "
+ (result.AddMinutes(1) > DateTime.Now).ToString());
Console.WriteLine("Add 1 minute, is less than UtcNow? "
+ (result.AddMinutes(1) < DateTime.UtcNow).ToString());
Console.WriteLine("Add 1 minute, is less than Now? "
+ (result.AddMinutes(1) < DateTime.Now).ToString());
Console.WriteLine("Subtract 1 minute, is greater than UtcNow? "
+ (result.AddMinutes(-1) > DateTime.UtcNow).ToString());
Console.WriteLine("Subtract 1 minute, is greater than Now? "
+ (result.AddMinutes(-1) > DateTime.Now).ToString());
Console.WriteLine("Subtract 1 minute, is less than UtcNow? "
+ (result.AddMinutes(-1) < DateTime.UtcNow).ToString());
Console.WriteLine("Subtract 1 minute, is less than Now? "
+ (result.AddMinutes(-1) < DateTime.Now).ToString());
इसके परिणामस्वरूप:
Kind: Unspecified
ToString(): 6/3/2010 10:17:05 PM
Add 1 minute, is greater than UtcNow? True
Add 1 minute, is greater than Now? True
Add 1 minute, is less than UtcNow? False
Add 1 minute, is less than Now? False
Subtract 1 minute, is greater than UtcNow? False
Subtract 1 minute, is greater than Now? True
Subtract 1 minute, is less than UtcNow? True
Subtract 1 minute, is less than Now? False
इसकी तुलना डेटटाइम से करें। अभी:
cmd.CommandText = "INSERT INTO testtbl (val) VALUES (@newval)";
cmd.Parameters.Add(new SqlParameter("@newval", DateTime.Now));
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT val FROM testtbl";
var result = (DateTime)cmd.ExecuteScalar();
Console.WriteLine("Kind: " + result.Kind);
Console.WriteLine("ToString(): " + result.ToString());
Console.WriteLine("Add 1 minute, is greater than UtcNow? "
+ (result.AddMinutes(1) > DateTime.UtcNow).ToString());
Console.WriteLine("Add 1 minute, is greater than Now? "
+ (result.AddMinutes(1) > DateTime.Now).ToString());
Console.WriteLine("Add 1 minute, is less than UtcNow? "
+ (result.AddMinutes(1) < DateTime.UtcNow).ToString());
Console.WriteLine("Add 1 minute, is less than Now? "
+ (result.AddMinutes(1) < DateTime.Now).ToString());
Console.WriteLine("Subtract 1 minute, is greater than UtcNow? "
+ (result.AddMinutes(-1) > DateTime.UtcNow).ToString());
Console.WriteLine("Subtract 1 minute, is greater than Now? "
+ (result.AddMinutes(-1) > DateTime.Now).ToString());
Console.WriteLine("Subtract 1 minute, is less than UtcNow? "
+ (result.AddMinutes(-1) < DateTime.UtcNow).ToString());
Console.WriteLine("Subtract 1 minute, is less than Now? "
+ (result.AddMinutes(-1) < DateTime.Now).ToString());
3:58 अपराह्न (स्थानीय, -7h) पर निष्पादित:
Kind: Unspecified
ToString(): 6/3/2010 3:59:26 PM
Add 1 minute, is greater than UtcNow? False
Add 1 minute, is greater than Now? True
Add 1 minute, is less than UtcNow? True
Add 1 minute, is less than Now? False
Subtract 1 minute, is greater than UtcNow? False
Subtract 1 minute, is greater than Now? False
Subtract 1 minute, is less than UtcNow? True
Subtract 1 minute, is less than Now? True