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?



Sorunları Ortadan Kaldırmak Için Enstrümanımızı Deneyin

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.'



tarih saat dönüştürme hatası

Şekil 1: Karakter dizisinden tarih ve / veya saat dönüştürme hatası



Yukarıda belirtilen 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 ayrıntılı 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çlanmasını sağlar. '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

Şekil 2: Hataya neden olan Yanlış Tarih Formatı



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

Şekil 3: 'gg / aa / yyyy' İngiliz / Fransız tarih stiliyle Doğru Tarih Biçimi

@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

Şekil 4: 'gg / aa / yy' İngiliz / Fransız tarih stiliyle Doğru Tarih Formatı

Ö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

Şekil 5: 2019 artık bir yıl olmadığından ortaya çıkan hata, bu nedenle tarih olarak 29 Şubat yok

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

Şekil 6: Doğru tarih

ISO 8601 Tarih Formatı:

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 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 formatı '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

Şekil 7: Uluslararası Standart ISO 8601 tarih biçimi

Ö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 text) 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ı arabirimi katmanına.

2 dakika okundu