SQL सर्वर में डेटाइम को सम्मिलित करने के लिए Sql क्वेरी


133

मैं datetimeनीचे दिए गए sql क्वेरी का उपयोग करके एक तालिका (SQL Server) में मान सम्मिलित करना चाहता हूं

insert into table1(approvaldate)values(18-06-12 10:34:09 AM);

लेकिन मुझे यह Error msg मिलता है। Incorrect syntax near '10'.

मैंने इसे उद्धरणों के साथ आजमाया

insert into table1(approvaldate)values('18-06-12 10:34:09 AM');

मुझे यह त्रुटि संदेश मिला Cannot convert varchar to datetime

कृप्या सहायता करे! धन्यवाद।

जवाबों:


229

आप SQL सर्वर में असंदिग्ध तिथि निर्धारण के लिए YYYYMMDD का उपयोग करना चाहेंगे।

insert into table1(approvaldate)values('20120618 10:34:09 AM');

यदि आप dd-mm-yy hh:mm:ss xmप्रारूप से विवाहित हैं , तो आपको विशिष्ट शैली के साथ CONVERT का उपयोग करना होगा।

insert table1 (approvaldate)
       values (convert(datetime,'18-06-12 10:34:09 PM',5));

5यहाँ इतालवी तारीखों के लिए शैली है। ठीक है, न केवल इटालियंस, लेकिन यह वह संस्कृति है जिसका श्रेय पुस्तकों ऑनलाइन में है


1
धन्यवाद .. यह काम करता है। Btw क्या DD-MM-YY प्रारूप में प्रवेश करना संभव नहीं है?
शी

@RichardTheKiwi क्या 5दर्शाता है?
शी

@ शी ने जवाब देने के लिए जोड़ा पाद लेख देखें
रिचर्ड दिवि

4
मैं सही-सही खड़ा हूं - यदि आप YYYYMMDD HH:MM:SS(24-घंटे के प्रारूप में - विश्व प्रारूप, कोई भी, लेकिन अमेरिका इसका उपयोग करता है, न कि केवल सैन्य ....) डैश के बिना - यह काम करता है, यहां तक ​​कि Britishभाषा के लिए भी । यदि आप YYYY-MM-DD HH:MM:SSहालांकि उपयोग करते हैं , तो यह विफल हो जाता है - उस स्थिति में (डैश के साथ), आपको शाब्दिक के साथ दिनांक और समय को अलग करने की आवश्यकता है T
marc_s

1
@ शीशी SET DATEFORMATबयान पर एक नज़र डालें । यह एक व्यक्तिगत कनेक्शन के लिए सेटिंग है, लेकिन सेटिंग को सर्वर-वाइड निर्दिष्ट किया जा सकता है। आप SET LANGUAGEचीजों को नियंत्रित करने के लिए भी निर्दिष्ट कर सकते हैं जैसे कि मूलांक और इस तरह के किस वर्ण का उपयोग किया जाता है, और दिनांक प्रारूप उस से फिर से प्राप्त होगा (सर्वर या कनेक्शन स्तरों पर)। यह सिर्फ इतना है कि डिफ़ॉल्ट यूएस अंग्रेजी है, और एमडी यूएस प्रारूप है। 4 साल की तारीख के साथ ymd हमेशा काम करता है, हालांकि।
बेकन बिट्स

29

स्ट्रिंग शाब्दिकों के लिए एक अधिक भाषा-स्वतंत्र विकल्प अंतर्राष्ट्रीय मानक आईएसओ 8601 प्रारूप "YYYY-MM-DDThh: mm: ss" है। मैंने प्रारूप का परीक्षण करने के लिए नीचे SQL क्वेरी का उपयोग किया है, और यह वास्तव में सभी SQL भाषाओं में sys.syslanguages में काम करता है :

declare @sql nvarchar(4000)

declare @LangID smallint
declare @Alias sysname

declare @MaxLangID smallint
select @MaxLangID = max(langid) from sys.syslanguages

set @LangID = 0

while @LangID <= @MaxLangID
begin

    select @Alias = alias
    from sys.syslanguages
    where langid = @LangID

    if @Alias is not null
    begin

        begin try
            set @sql = N'declare @TestLang table (langdate datetime)
    set language ''' + @alias + N''';
    insert into @TestLang (langdate)
    values (''2012-06-18T10:34:09'')'
            print 'Testing ' + @Alias

            exec sp_executesql @sql
        end try
        begin catch
            print 'Error in language ' + @Alias
            print ERROR_MESSAGE()
        end catch
    end

    select @LangID = min(langid)
    from sys.syslanguages
    where langid > @LangID
end

Microsoft TechNet में स्ट्रिंग लिटरल दिनांक और समय प्रारूप अनुभाग के अनुसार , मानक ANSI मानक SQL दिनांक स्वरूप "YYYY-MM-DD hh: mm: ss" को "बहु-भाषा" माना जाता है। हालाँकि, एक ही क्वेरी का उपयोग करते हुए, ANSI प्रारूप सभी SQL भाषाओं में काम नहीं करता है।

उदाहरण के लिए, डेनिश में, आपको निम्नलिखित की तरह कई त्रुटियां होंगी:

भाषा में त्रुटि डेनिश एक varchar डेटा प्रकार के डेटाटाइम डेटा प्रकार में परिवर्तित होने के परिणामस्वरूप एक आउट-ऑफ-रेंज मान होता है।

यदि आप SQL सर्वर पर चलने के लिए C # में एक क्वेरी बनाना चाहते हैं, और आपको ISO 8601 प्रारूप में एक दिनांक पास करने की आवश्यकता है, तो Sortable "s" प्रारूप विनिर्देशक का उपयोग करें :

string.Format("select convert(datetime2, '{0:s}'", DateTime.Now);

लगता है कि आप YYYYMMDDकेवल दिनांक के लिए उपयोग कर सकते हैं , और या तो YYYY-MM-DDThh:mm:ss(डैश के साथ, और हाँ, एक Tदिनांक और समय भाग के बीच!) या YYYYMMDD HH:MM:SS(कोई डैश, कोई जुदाई शाब्दिक) सही मायने में भाषा स्वतंत्र होने के लिए ...
marc_s

1
@marc_s: टिप्पणी के लिए धन्यवाद। मैंने आईएसओ 8601 प्रारूप का उल्लेख करने के लिए अपना जवाब संपादित किया (जिसमें टी शाब्दिक भी शामिल है जैसा आपने उल्लेख किया है)।
पॉल विलियम्स

@TestLang (langdate) मान ('2012-06-18T10: 34: 09') में सम्मिलित करना सर्वोत्तम उत्तर है।
MERT DOĞAN


8

आपको इसे जोड़ने की आवश्यकता है

insert into table1(date1) values('12-mar-2013');

2

कन्वर्ट का उपयोग करने की आवश्यकता नहीं है। बस इसे आईएसओ 8601 प्रारूप में एक उद्धृत तिथि के रूप में सूचीबद्ध करें।
इस तरह:

select * from table1 where somedate between '2000/01/01' and '2099/12/31'

विभाजक को एक होने की आवश्यकता है /और इसे एकल 'उद्धरणों से घिरा होना चाहिए ।


1

यदि आप किसी भी प्रोग्रामिंग भाषा के माध्यम से मान संचय कर रहे हैं

यहाँ C # में एक उदाहरण है

तारीख को स्टोर करने के लिए आपको इसे पहले बदलना होगा और फिर स्टोर करना होगा

insert table1 (foodate)
   values (FooDate.ToString("MM/dd/yyyy"));

FooDate डेटाइम वैरिएबल है जिसमें आपकी फॉर्मेट में आपकी डेट सम्‍मिलित है।


1

मैं एक अधिक सामान्य समस्या में मुठभेड़ करता हूं: अलग-अलग (और जरूरी नहीं कि ज्ञात) डेटाइम प्रारूप प्राप्त कर रहा हूं और उन्हें डेटाइम कॉलम में सम्मिलित करता हूं। मैंने इसे इस कथन का उपयोग करके हल किया है, जो अंत में एक स्केलर फ़ंक्शन बन गया था (ODBC विहित, अमेरिकन, ANSI और ब्रिटिश \ _ फ्रैंचाइज़ी तिथि शैली के लिए प्रासंगिक है - इसका विस्तार किया जा सकता है):

insert into <tableName>(<dateTime column>) values(coalesce 
(TRY_CONVERT(datetime, <DateString, 121), TRY_CONVERT(datetime, <DateString>, 
101), TRY_CONVERT(datetime, <DateString>, 102), TRY_CONVERT(datetime, 
<DateString>, 103))) 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.