C # का उपयोग करके SQL प्रारूप में दिनांक समय प्रारूप


111

मैं C # से वर्तमान दिनांक समय प्रारूप को सहेजने और इसे SQL सर्वर दिनांक स्वरूप में परिवर्तित करने का प्रयास yyyy-MM-dd HH:mm:ssकर रहा हूं, ताकि मैं इसे अपनी UPDATEक्वेरी के लिए उपयोग कर सकूं।

यह मेरा पहला कोड था:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");

दिनांक पर आउटपुट ठीक है, लेकिन समय हमेशा "12:00:00" है, इसलिए मैंने अपना कोड निम्न में बदल दिया:

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.TimeOfDay.ToString("HH:mm:ss");

इसने मुझे यह संकलित त्रुटि दी:

FormatException अनहेल्दी थी

और सुझाव दिया कि मुझे पार्स करने की आवश्यकता है। इसलिए मैंने StackOverflow में अपने शोध के अनुसार अपने कोड में ऐसा करने की कोशिश की:

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.Parse.TimeOfDay.ToString("HH:mm:ss");

या

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.tryParse.TimeOfDay.ToString("HH:mm:ss");

लेकिन यह मुझे बता रहा है कि यह एक विधि है जो दिए गए संदर्भ के लिए मान्य नहीं है। मैंने अपनी समस्या का समाधान खोजने की कोशिश की और मैं अब दो घंटे से अटका हुआ हूं। मैं अभी भी C # में थोड़ा नया हूँ, क्या आप कृपया मेरी मदद कर सकते हैं?


क्या आपने DateTime.TryParseExact को देखा है?
टिम


3
अद्यतन करने के लिए एक पैरामीटर का उपयोग क्यों नहीं किया जाता है DateTimeया आप इसे स्ट्रिंग के रूप में संग्रहीत कर रहे हैं? इसके अलावा ToStringपर Dateअर्थ होगा कि समय हमेशा होता है12:00:00
V4Vendetta

3
आपको पैरामीटर के प्रकार के साथ एक पैरामीरिज्ड क्वेरी का उपयोग करना चाहिए DATETIMEऔर फिर आप स्ट्रिंग के प्रतिनिधित्व से आगे और पीछे यह सब परिवर्तित करने से बच सकते हैं!
marc_s

5
जैसा कि दूसरों ने कहा है, मापदंडों का उपयोग करना और बस एक चीज के रूप में सब कुछ रखना datetimeएक अच्छी शुरुआत होगी। इससे भी बेहतर, आप सर्वर को वर्तमान समय क्यों पास कर रहे हैं - इसमें एक GETDATE()फ़ंक्शन है जिसे पूरी तरह से सर्वर साइड पर कहा जा सकता है।
डेमियन___बेलिवर्स

जवाबों:


219

नीचे यह कोशिश करो

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");

बहुत बहुत धन्यवाद मैं कोशिश कर रहा था स्ट्रिंग sqlFormattedDate = myDateTime.DateTime ... किसी कारण के लिए यह है कि मैं क्या हासिल करना चाहता हूँ।
ऐस कैसरिया

स्टैकओवरफ़्लो में मेरी खोज मुझे एक गलत संदर्भ का हवाला देती रहती है, हालांकि इस सवाल का जवाब कई बार दिया गया था, मेरे जैसे नए लोग इस वजह से संबंधित नहीं हो सकते। क्षमा करें सभी, मैं जैसे ही सक्षम हूं, मैं प्रश्न बंद कर दूंगा।
ऐस कैसरिया

1
मुझे लगता है कि C # "Sortable" प्रारूप एक ही काम करता है। तो आप बस myDateTime.ToString ("s") कर सकते हैं;
प्रोवेगा

@ProVega यह समान नहीं दिखता है (.ToString ('s') में दिनांक और समय के बीच के स्थान के बजाय T है) - लेकिन मैं पुष्टि कर सकता हूं कि वे T के साथ या उसके बिना SQL सर्वर द्वारा पार्स किए गए हैं ( मैं 2012 पर हूं)। मैंने अपने लॉगिंग डेटाइम फॉर्मेट के रूप में 's' का उपयोग करना शुरू कर दिया है, इसलिए मैं सोचता हूं कि धन्यवाद!
इयान ग्रिंजर

हाँ, आधिकारिक पृष्ठ CAST और CONVERT (Transact-SQL) पर , वे "ODBC विहित" नाम का उपयोग उस फॉर्म के लिए करते yyyy-MM-ddहैं, जो दिन के समय से अलग होने वाले स्थान के साथ होता है, और "ISO8601" नाम उस फॉर्म के लिए होता है, जहाँ अलग होने वाला वर्ण होता है। a T। लेकिन हाँ, दोनों रूप अव्यवस्थित (और सही ढंग से) रूपांतरित करते हैं datetime
जेपी स्टिग नीलसन

44

मानक डेटाटाइम प्रारूप "s" का उपयोग अंतर्राष्ट्रीयकरण संगतता (MM / dd बनाम dd / MM) को भी सुनिश्चित करेगा:

myDateTime.ToString("s");

=> 2013-12-31T00:00:00

पूर्ण विकल्प: (कोड: नमूना परिणाम)

d: 6/15/2008 
D: Sunday, June 15, 2008 
f: Sunday, June 15, 2008 9:15 PM 
F: Sunday, June 15, 2008 9:15:07 PM 
g: 6/15/2008 9:15 PM 
G: 6/15/2008 9:15:07 PM 
m: June 15 
o: 2008-06-15T21:15:07.0000000 
R: Sun, 15 Jun 2008 21:15:07 GMT 
s: 2008-06-15T21:15:07 
t: 9:15 PM 
T: 9:15:07 PM 
u: 2008-06-15 21:15:07Z 
U: Monday, June 16, 2008 4:15:07 AM 
y: June, 2008 

'h:mm:ss.ff t': 9:15:07.00 P 
'd MMM yyyy': 15 Jun 2008 
'HH:mm:ss.f': 21:15:07.0 
'dd MMM HH:mm:ss': 15 Jun 21:15:07 
'\Mon\t\h\: M': Month: 6 
'HH:mm:ss.ffffzzz': 21:15:07.0000-07:00

.NET फ्रेमवर्क में समर्थित: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
संदर्भ: DateTime.ToStringविधि


1
यह पर्याप्त रूप से दानेदार नहीं है (मिलीसेकंड को याद करता है) और आपको उन प्रश्नों में परेशानी में डाल देगा जो कि तिथि द्वारा आदेश देने पर निर्भर करते हैं।
११:

साथ ही घंटे और मिनट प्राप्त करने के लिए, आप इस रूपांतरण का उपयोग कर सकते हैं: string sqlFormattedDate = YourDate.ToString ("yyyy-MM-ddTHH: mm: ss", System.Globalization.CultureInfo.InvariantCulture);
नेटफेड

9

सही उत्तर पहले से ही "उपयोग मापदंडों" दिया गया था। किसी दिनांक को स्वरूपित करना और इसे SQL-Server के लिए स्ट्रिंग के रूप में पारित करना त्रुटियों को जन्म दे सकता है क्योंकि यह सेटिंग्स पर निर्भर करता है कि दिनांक को सर्वर की ओर कैसे व्याख्या की जाती है। यूरोप में, हम 1 दिसंबर 2012 को इंगित करने के लिए '1.12.2012' लिखते हैं, जबकि अन्य देशों में इसे 12 वीं कक्षा के रूप में माना जा सकता है।

सीधे SSMS में बयान जारी करते समय मैं प्रारूप का उपयोग करता हूं yyyymmdd जो काफी सामान्य प्रतीत होता है। मैंने अब तक जिन विभिन्न प्रतिष्ठानों पर काम किया, उन पर कोई समस्या नहीं आई।

वहाँ एक और शायद ही कभी इस्तेमाल किया प्रारूप है, जो थोड़ा अजीब है, लेकिन सभी संस्करणों के लिए काम करता है:

select { d '2013-10-01' }

अक्टूबर 2013 की पहली वापसी होगी।

select { ts '2013-10-01 13:45:01' }

अक्टूबर 1, 1:45:01 PM पर वापस आएंगे

मैं मापदंडों का उपयोग करने की दृढ़ता से सलाह देता हूं और होमग्रोन फॉर्मेट स्टेटमेंट अंशों को एक साथ चिपकाकर अपने स्वयं के एसक्यूएल कोड को कभी भी प्रारूपित नहीं करता हूं । यह एसक्यूएल इंजेक्शन और अजीब त्रुटियों के लिए एक प्रविष्टि है (एक फ्लोट मूल्य को प्रारूपित करना एक और संभावित मुद्दा है)


3

ऐसा करने से आपका पहला कोड काम करेगा

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); //Remove myDateTime.Date part 

3

आपकी समस्या "दिनांक" संपत्ति में है जो DateTimeकेवल तिथि तक कम हो जाती है। आप इस तरह से रूपांतरण डाल सकते हैं:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); // <- No Date.ToString()!

2

जवाब मैं देख रहा था:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");

मैंने यह भी सीखा है कि आप इसे इस तरह से कर सकते हैं:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString(myCountryDateFormat);

जहाँ आवश्यकता के आधार पर परिवर्तन को पूरा करने के लिए myCountryDateFormat को बदला जा सकता है।

कृपया ध्यान दें कि "इस प्रश्न का पहले से ही यहाँ एक उत्तर हो सकता है": वास्तव में इस प्रश्न का उत्तर नहीं दिया गया है क्योंकि आप इसे छोड़ने के बजाय ".Date" का उपयोग कर सकते हैं। यह .NET के नए प्रोग्रामर्स के लिए काफी भ्रामक है


2

यदि आप तालिका में वर्तमान तिथि संग्रहीत करना चाहते हैं तो आप उपयोग कर सकते हैं

तारीख लें();

या इस फ़ंक्शन को एक पैरामीटर के रूप में पास करें

जैसे। 'अपडेट tblname सेट दही = GETDATE () जहां colname = 123'



1

आपकी समस्या उस Dateसंपत्ति में है जो DateTimeकेवल आज तक छंटनी करती है। आप इस तरह से रूपांतरण डाल सकते हैं:

DateTime myDateTime = DateTime.Now;

string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");

धन्यवाद। बस मैं क्या देख रहा था;) आश्चर्यचकित माइक्रोसॉफ्ट ने इसे और अधिक संक्षेप में करने के लिए एक ध्वज या आदेश नहीं जोड़ा।
Zeek2

0

SQL सर्वर भाषा सेटिंग्स के बावजूद, C # से SQL सर्वर से डेटटाइम पास करने का एक और उपाय

माना जाता है कि आपकी क्षेत्रीय सेटिंग्स तब dd.MM.yyyy (जर्मन मानक '104') के रूप में प्रदर्शित होती हैं

DateTime myDateTime = DateTime.Now;
string sqlServerDate ="CONVERT("date,'"+myDateTime+"',104)"; 

SQL सर्वर दिनांक प्रकार चर C # डेटाइम चर को "104" नियमों के अनुसार मैपिंग पर विचार करता है। Sql सर्वर दिनांक yyyy-MM-dd हो जाता है

यदि आपकी क्षेत्रीय सेटिंग्स अलग से डेटटाइम प्रदर्शित करती हैं, तो SQL सर्वर CONVERT तालिका से उपयुक्त मिलान का उपयोग करें

नियमों के बारे में और देखें: https://www.techonthenet.com/sql_server/functions/convert.php


0

मुझे लगता है कि समस्या दो एकल उद्धरण गायब थी।

यह MSSMS के लिए चलने वाला sql है:

WHERE checktime >= '2019-01-24 15:01:36.000' AND checktime <= '2019-01-25 16:01:36.000'

जैसा कि आप देख सकते हैं कि दो एकल उद्धरण हैं, इसलिए आपके कोड होने चाहिए:

string sqlFormattedDate = "'" + myDateTime.Date.ToString("yyyy-MM-dd") + " " + myDateTime.TimeOfDay.ToString("HH:mm:ss") + "'";

MSSQL में या MySQL में भी हर स्ट्रिंग के लिए सिंगल कोट्स का उपयोग करें। आशा है कि ये आपकी मदद करेगा।


0

SqlDateTime वर्ग में निर्मित का उपयोग करते हैं

new SqlDateTime(DateTime.Now).ToSqlString()

लेकिन अभी भी अशक्त मूल्यों की जांच करने की आवश्यकता है। यह अतिप्रवाह अपवाद को फेंक देगा

new SqlDateTime(DateTime.MinValue).ToSqlString()

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.



-1

यदि आप उस दिनांक समय सारणी को अपडेट करना चाहते हैं, तो आप इस उदाहरण की तरह अपने sql स्ट्रिंग का उपयोग कर सकते हैं:

int fieldId;
DateTime myDateTime = DateTime.Now
string sql = string.Format(@"UPDATE TableName SET DateFieldName='{0}' WHERE FieldID={1}, myDateTime.ToString("yyyy-MM-dd HH:mm:ss"), fieldId.ToString());

2
इस सवाल का पहले ही जवाब दिया जा चुका है और इसे अधिक सुरुचिपूर्ण समाधान के साथ स्वीकार किया गया है। और आप एक समापन याद कर रहे हैं "
जन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.