Aşağıdaki gibi bir tablo oluşturmaya çalışıyordum,
create table table1(date1 datetime,date2 datetime);
Önce aşağıdaki gibi değerler eklemeyi denedim,
insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');
Şöyle bir hata verdi,
Varchar tarih saatine dönüştürülemiyor
Daha sonra stackoverflow tarafından önerilen yazılardan biri olarak aşağıdaki formatı denedim,
insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
,convert(datetime,'01-01-2001 12:00:00 AM',5));
Ama hala şu hatayı alıyorum,
Karakter dizesinden tarih ve/veya saat dönüştürülürken dönüştürme başarısız oldu
Öneriniz var mı?
SQL Server tarafından desteklenen birçok format vardır - CAST ve CONVERT hakkında MSDN Books Online'e bakın. Bu biçimlerin çoğu, sahip olduğunuz ayarlara bağlıdır - bu nedenle, bu ayarlar bazı zamanlarda işe yarayabilir - bazen de yaramayabilir.
Bunu çözmenin yolu SQL Server tarafından desteklenen (biraz uyarlanmış) ISO-8601 tarih biçimini kullanmaktır - bu biçim SQL Server diliniz ve tarih biçimi ayarlarınız ne olursa olsun her zaman çalışır.
ISO-8601 biçimi]2 SQL Server tarafından iki şekilde desteklenir:
YYYMMDD
(zaman kısmı yok); buraya dikkat edin: tire yok!, bu çok önemli! YYYY-MM-DD` SQL Server'ınızdaki tarih biçimi ayarlarından BAĞIMSIZDIR ve her durumda ÇALIŞMAYACAKTIR!ya da:
YYY-MM-DDTHH:MM:SS
- buraya dikkat edin: bu formatta tire işaretleri vardır (ancak atlanabilir*) ve DATETIME
ınızın tarih ve saat kısmı arasında sınırlayıcı olarak sabit bir T
bulunur.Bu SQL Server 2000 ve daha yeni sürümler için geçerlidir.
Yani somut durumunuzda - bu dizeleri kullanın:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
ve iyi olmalısınız (not: bunun için 12 saatlik AM/PM formatı yerine uluslararası 24 saat formatını kullanmanız gerekir).
Alternatif olarak: SQL Server 2008 veya daha yeni bir sürüm kullanıyorsanız, DATETIME2
veri türünü de kullanabilirsiniz (düz DATETIME
yerine) ve mevcut INSERT
işleminiz sorunsuz bir şekilde çalışacaktır! :-) DATETIME2` çok daha iyidir ve dönüşümlerde çok daha az seçicidir - ve zaten SQL Server 2008 veya daha yenisi için önerilen tarih/zaman veri tipleridir.
SELECT
CAST('02-21-2012 6:10:00 PM' AS DATETIME2), -- works just fine
CAST('01-01-2012 12:00:00 AM' AS DATETIME2) -- works just fine
Bana tüm bu konunun neden bu kadar zor ve biraz kafa karıştırıcı olduğunu sormayın - bu sadece böyle. Ancak YYYMMDD
formatı ile SQL Server'ın herhangi bir sürümü ve SQL Server'ınızdaki herhangi bir dil ve tarih formatı ayarı için sorun yaşamazsınız.
SQL sunucusundaki dönüşüm bazen kullanılan Tarih veya Saat biçimleri nedeniyle başarısız olur, Bunun nedeni yalnızca sistem tarafından kabul edilmeyen yanlış verileri depolamaya çalışmanızdır.
Örnek:
Tablomu Oluştur (MyDate);
Insert Into MyTable(MyDate) Values ('2015-02-29');
SQL sunucusu aşağıdaki hatayı verecektir:
Tarih ve/veya saati karakter dizesinden dönüştürürken dönüştürme başarısız oldu.
Bu hatanın nedeni basitçe Yıl (2015) içinde böyle bir tarihin (29 Şubat) olmamasıdır.
Basit cevap - 5 İtalyanca "yy" ve 105 İtalyanca "yyyy". Bu nedenle:
SELECT convert(datetime,'21-02-12 6:10:00 PM',5)
doğru çalışacaktır, ancak
SELECT convert(datetime,'21-02-12 6:10:00 PM',105)
hata verecektir.
Aynı şekilde,
SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)
hata verecektir, burada
SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)
işe yarayacak.