SQL Server'da datetime eklemek için SQL sorgusu


133

datetimeAşağıdaki sql sorgusunu kullanarak bir tabloya (SQL Server) bir değer eklemek istiyorum

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

Ama bu Hata mesajını alıyorum. Incorrect syntax near '10'.

Alıntılarla denedim

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

Bu hata mesajını alıyorum Cannot convert varchar to datetime

Kibarca yardım! Teşekkürler.

Yanıtlar:


229

SQL Server'da kesin tarih tespiti için YYYYAAGG kullanmak isteyeceksiniz.

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

Biçimle evli dd-mm-yy hh:mm:ss xmiseniz, CONVERT'i belirli bir stille kullanmanız gerekecektir.

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

5İtalyan randevularının stili burada. Şey, sadece İtalyanlar değil, Books Online'da atfedilen kültür budur .


1
Teşekkür ederim .. Çalışıyor. Btw GG-AA-YY biçiminde girilemez mi?
Shee

@RichardTheKiwi ne anlama geliyor 5?
Shee

@Shee, cevaplamak için altbilgi eklendi
RichardTheKiwi

4
Düzeltilmiş durumdayım - eğer YYYYMMDD HH:MM:SS(24 saat formatında - dünya formatında, ABD dışında herkes bunu kullanır, sadece askeri değil ....) çizgiler olmadan - Britishdil için bile işe yarıyor . YYYY-MM-DD HH:MM:SSAncak kullanırsanız , başarısız olur - bu durumda (çizgilerle), tarih ve saati birebir ile ayırmanız gerekirT .
marc_s

1
Bir göz atın @Shee SET DATEFORMATaçıklamada . Bu, bireysel bir bağlantı için yapılan ayardır, ancak ayar sunucu genelinde belirlenebilir. Ayrıca SET LANGUAGE, taban için hangi karakterin kullanıldığı gibi şeyleri kontrol etmeyi de belirtebilirsiniz ve tarih formatı bundan miras alır (yine, sunucu veya bağlantı seviyelerinde). Yalnızca varsayılan ABD İngilizcesi ve mdy ABD formatıdır. 4 yıllık tarihlere sahip ymd her zaman çalışır.
Bacon Bits

29

Dize değişmezleri için dilden daha bağımsız bir seçenek, uluslararası standart ISO 8601 biçimi "YYYY-AA-GGTss: dd: ss" dir. Formatı test etmek için aşağıdaki SQL sorgusunu kullandım ve gerçekten de sys.sys dillerinde tüm SQL dillerinde çalışıyor :

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

Göre Dize Birebir Tarih ve Saat Biçimleri Microsoft TechNet, standart ANSI Standardı SQL tarih biçimi ": dd: YYYY-AA-GG ss ss" bölümünün "çok-dilli" olması gerekiyordu. Ancak, aynı sorguyu kullanarak ANSI biçimi tüm SQL dillerinde çalışmaz.

Örneğin, Danca'da aşağıdaki gibi birçok hata yapacaksınız:

Danca dilinde hata Varchar veri türünün tarih saat veri türüne dönüştürülmesi, aralık dışı bir değerle sonuçlandı.

SQL Server'da çalıştırmak için C #'da bir sorgu oluşturmak istiyorsanız ve ISO 8601 biçiminde bir tarih iletmeniz gerekiyorsa , Sıralanabilir "s" biçim belirticisini kullanın :

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

Görünüşe göre YYYYMMDDyalnızca tarih için kullanabiliyorsunuz ve ya YYYY-MM-DDThh:mm:ss(kısa çizgilerle ve evet, Ttarih ve saat arasında bir bölüm var!) Ya da YYYYMMDD HH:MM:SS(tire yok, harf ayrımı yok) gerçekten dilden bağımsız olacak ...
marc_s

1
@marc_s: Yorumunuz için teşekkürler. Cevabımı ISO 8601 formatından bahsetmek için düzenledim (bahsettiğiniz T harfini içerir).
Paul Williams

@TestLang (langdate) değerlerine ekle ('2012-06-18T10: 34: 09') en iyi yanıttır.
MERT DOĞAN

20

Yönetim stüdyosu, aşağıdaki gibi komut dosyaları oluşturur:

insert table1 (foodate) values(CAST(N'2012-06-18 10:34:09.000' AS DateTime))

8

gibi eklemelisin

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

2

Convert kullanmaya gerek yok. Bunu ISO 8601 formatında alıntı tarihi olarak listelemeniz yeterlidir.
Şöyle:

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

Ayırıcının a olması /ve tek 'tırnak içine alınması gerekir.


1

Değerleri herhangi bir programlama dili aracılığıyla depoluyorsanız

İşte C # bir örnek

Tarihi saklamak için önce onu dönüştürmeli ve sonra kaydetmelisiniz

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

FooDate, tarihinizi formatınızda içeren datetime değişkenidir.


1

Daha genel bir sorunla karşılaşıyorum: farklı (ve bilinmesi gerekmeyen) tarih saat biçimleri almak ve bunları tarih saat sütununa eklemek. Sonunda skaler bir işlev haline gelen bu ifadeyi kullanarak çözdüm (ODBC kanonik, amerikan, ANSI ve british \ franch date stili ile ilgili - genişletilebilir):

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))) 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.