Permintaan sql untuk memasukkan datetime dalam SQL Server

133

Saya ingin memasukkan datetimenilai ke dalam tabel (SQL Server) menggunakan kueri sql di bawah ini

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

Tapi saya mendapatkan pesan kesalahan ini. Incorrect syntax near '10'.

Saya mencobanya dengan kutipan

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

Saya mendapatkan pesan kesalahan ini Cannot convert varchar to datetime

Mohon bantuannya! Terima kasih.

Shee
sumber

Jawaban:

229

Anda akan ingin menggunakan YYYYMMDD untuk penentuan tanggal yang jelas dalam SQL Server.

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

Jika Anda sudah menikah dengan dd-mm-yy hh:mm:ss xmformat, Anda perlu menggunakan CONVERT dengan gaya tertentu.

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

5di sini adalah gaya untuk kencan Italia. Ya, bukan hanya orang Italia, tapi itulah budaya yang dikaitkan dengan Books Online .

RichardTheKiwi
sumber
1
Terima kasih .. Berhasil. Btw apakah tidak mungkin untuk memasukkan dalam format DD-MM-YY?
Shee
@RichardTheKiwi apa artinya 5?
Shee
@Shee lihat menambahkan footer untuk menjawab
RichardTheKiwi
4
Saya berdiri dikoreksi - jika Anda menggunakan YYYYMMDD HH:MM:SS(dalam format 24 jam - format dunia, siapa pun selain AS menggunakan ini, bukan hanya militer ....) tanpa garis - ia berfungsi, bahkan untuk Britishbahasa. Namun jika Anda menggunakan YYYY-MM-DD HH:MM:SS, itu gagal - dalam kasus itu (dengan tanda hubung), Anda perlu memisahkan tanggal dan waktu dengan Tliteral.
marc_s
1
@ Shee Lihatlah SET DATEFORMATpernyataannya . Ini adalah pengaturan untuk koneksi individual, tetapi pengaturan dapat ditentukan di seluruh server. Anda juga dapat menentukan SET LANGUAGEuntuk mengontrol hal-hal seperti karakter mana yang digunakan untuk radix dan sejenisnya, dan format tanggal akan mewarisi dari itu (lagi-lagi, di tingkat server atau koneksi). Hanya saja defaultnya adalah Bahasa Inggris AS, dan mdy adalah format AS. ymd dengan tanggal 4 tahun tidak selalu berhasil.
Bacon Bits
29

Pilihan bahasa-lebih bebas untuk string literal adalah format ISO 8601 standar internasional "YYYY-MM-DDThh: mm: ss". Saya menggunakan query SQL di bawah ini untuk menguji format, dan itu memang berfungsi di semua bahasa SQL di 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

Menurut bagian Format Tanggal dan Waktu Literal di Microsoft TechNet, format standar tanggal standar ANSI SQL "YYYY-MM-DD hh: mm: ss" seharusnya "multi-bahasa". Namun, menggunakan kueri yang sama, format ANSI tidak berfungsi di semua bahasa SQL.

Misalnya, dalam bahasa Denmark, Anda akan mengalami banyak kesalahan seperti berikut:

Kesalahan dalam bahasa Denmark Konversi tipe data varchar ke tipe data datetime menghasilkan nilai di luar kisaran.

Jika Anda ingin membuat kueri dalam C # untuk dijalankan di SQL Server, dan Anda harus memberikan tanggal dalam format ISO 8601, gunakan specifier format "s" Sortable :

string.Format("select convert(datetime2, '{0:s}'", DateTime.Now);
Paul Williams
sumber
Tampaknya Anda dapat menggunakan YYYYMMDDhanya tanggal, dan YYYY-MM-DDThh:mm:ss(dengan tanda hubung, dan ya, Tantara tanggal dan waktu!) Atau YYYYMMDD HH:MM:SS(tanpa tanda hubung, tanpa pemisahan huruf) untuk benar-benar mandiri dalam bahasa ...
marc_s
1
@marc_s: Terima kasih atas komentarnya. Saya mengedit jawaban saya untuk menyebutkan format ISO 8601 (yang termasuk T literal seperti yang Anda sebutkan).
Paul Williams
masukkan nilai @TestLang (langdate) ('2012-06-18T10: 34: 09') adalah jawaban terbaik.
MERT DOĞAN
20

Studio manajemen membuat skrip seperti:

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

Anda perlu menambahkannya seperti

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

Tidak perlu menggunakan konversi. Cukup daftarkan sebagai tanggal yang dikutip dalam format ISO 8601.
Seperti itu:

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

Pemisah harus a /dan perlu dikelilingi oleh 'tanda kutip tunggal .

Johan
sumber
1

Jika Anda menyimpan nilai melalui bahasa pemrograman apa pun

Berikut ini contoh dalam C #

Untuk menyimpan tanggal, Anda harus mengonversikannya terlebih dahulu dan kemudian menyimpannya

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

FooDate adalah variabel datetime yang berisi tanggal Anda dalam format Anda.

Pankaj
sumber
1

Saya menemukan masalah yang lebih umum: mendapatkan format datetime yang berbeda (dan belum tentu dikenal) dan memasukkannya ke dalam kolom datetime. Saya telah menyelesaikannya dengan menggunakan pernyataan ini, yang akhirnya menjadi fungsi skalar (relevan untuk ODBC kanonik, Amerika, ANSI, dan gaya tanggal waralaba \ Inggris - dapat diperluas):

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))) 
Guy E
sumber