Karakter Dizisinden Tarih ve / veya Saat Dönüştürülürken "Dönüştürme Başarısız Oldu" Hatası Nasıl Onarılır?
Tarihlerin ve saatlerin olmasını istediğiniz biçimde görünmediği veya bir sorgu çıktısının izleyicilerin ihtiyaçlarına uymadığı birçok durum vardır. Tarih dizesini ihtiyacınıza göre biçimlendirmek için çeşitli SQL Server yerleşik özellikleri vardır, ancak dizenin SQL Server tarafından yorumlanması ve dönüştürme hatalarını önlemek için uygun biçimde olması gerekir. Tarih veya saati karakter dizisinden dönüştürmeye çalıştığımızda bazen aşağıdaki hata ortaya çıkar. "Tarih ve / veya saat karakter dizesinden dönüştürülürken dönüştürme başarısız oldu."
Yukarıda bahsedilen hata normalde tarih değişmez değeri uygun olmadığında ve dizeden DateTime veya tarihe dönüştürülemediğinde ortaya çıkar. Bu hata, çözüm seti ile birlikte detaylı olarak tartışacağımız bir takım nedenlerden kaynaklanmaktadır.
Örnek 1:
Birleşik Krallık Tarih ve saat gösterimi, tarihi, biçimlendirme stili 103 ile SQL Server built_in özelliği "dönüştürme" işlevini kullanarak elde edebileceğimiz gün-ay-yıl biçimini (10 Ocak 2015 veya 10/1/2015) kullanarak görüntüler.
Aşağıdaki örnekte, verilen tarih dizesinin yanlış formatta olduğunu görebiliriz. Birincisi, yanlış olan ve SQL Server tarafından yorumlanamayan ayı, sonra günleri ve geçen yıl bir hata ile sonuçlanan bir bilgi vermektir. "103" tarih stilini kullanan İngiltere stili tarih dönüştürme için doğru format "gg / aa / yyyy" dir.
Yanlış format:
@Date_time_value varchar (100) = '10 / 16/2015 21:02:04 'beyan edin, UK_Date_Time_Style olarak CONVERT (datetime2, @date_time_value, 103) seçin
Doğru Format:
İngiliz ve Fransız tarih biçimi 103 = "gg / aa / yyyy" veya 3 = "gg / aa / yy" şeklindedir. Burada 103 ve 3 tarih stilleridir.
@Date_time_value varchar (100) = '10 / 1/15 21:02:04 'beyan edin, CONVERT (datetime2, @date_time_value, 103) Date_Time_Style olarak seçin
@Date_time_value varchar (100) = '10 / 1/15 21:02:04 'beyan edin, CONVERT (datetime2, @date_time_value, 3) UK_Date_Time_Style olarak seçin
Örnek 2:
Bazen SQL sunucusunda dizeden tarihe dönüştürme, kullanılan tarih veya saat biçimleri nedeniyle değil, şema için kabul edilebilir olmayan yanlış bilgileri depolamaya çalışmanız nedeniyle hatayla sonuçlanır.
Yanlış tarih:
Aşağıdaki hatanın nedeni, 2019 yılında artık yıl olmadığı için "29 Şubat" diye bir tarihin olmamasıdır.
@Date_time_value varchar (100) = '2019-02-29 21:02:04' tarih_saat_değeri olarak cast (@date_time_value olarak datetime2) seçin
Doğru olan:
@Date_time_value varchar (100) = '2019-02-28 21:02:04' tarih_saat_değeri olarak cast (@date_time_value olarak datetime2) seçin
ISO 8601 Tarih Biçimi:
Tarih değerlerini işlemek için çok sayıda format bulunmasına rağmen, global / uluslararası bir kitle için çalışırken, bir datetime gösterimi seçmek bir kullanılabilirlik sorunu olabilir. Bu nedenle kültüre özgü tarih / saat değişmezlerinden kaçınılmalıdır. Bu tarihi “03/08/2018” olarak ele alırsak dünyanın farklı bölgelerinde farklı şekillerde yorumlanacaktır.
- İngiltere tarzında "8 Mart 2018" olarak yorumlanır
- Avrupa tarzında "3 Ağustos 2018" olarak yorumlanır.
Neyse ki, ISO tarafından geliştirilen uluslararası tarih biçiminde bir alternatif var. Küresel standart ISO 8601 biçimi "YYYY-AA-GGTss: dd: ss", dizgi değişmezleri için dilden daha bağımsız bir seçenektir ve tüm bu sorunları ele alır. Oysa "yyyy" yıl, "aa" ay ve "gg" gündür. Dolayısıyla uluslararası ISO formatında “8 Mart 2018” tarihi “2018-03-08” olarak yazılmıştır. Bu nedenle ISO formatı, tarih gösterimi için en iyi seçimdir.
@Date_time_value varchar (100) = '2019-03-28 21:02:04' deklare edin (datetime2, @ date_time_value, 126) [yyyy-aa-ggThh: mi: ss.mmm] olarak seçin
Öneriler:
Umarım bu makale, tarih / saat değerleri hakkında toplulukta sıkça gördüğüm kafa karışıklığını gidermeye yardımcı olacaktır. Bununla birlikte, tarihleri hiçbir zaman metin türünde (varchar, char, nvarchar, nchar veya metin) saklamamanız önerilir Tarih değerini her zaman DATE, DATETIME ve tercihen DATETIME2 (daha kesinlik sağlar) türü sütunlarda saklayın ve tarih bilgisi biçimlendirmesini bırakın veritabanından alınmak yerine kullanıcı arayüzü katmanına aktarılır.