Gelen belgeler , çok açık bir şekilde sadece güvenli biçimleri çok sorunun başlayan gösterişe olanlardır belirtilmektedir:
yyyyMMdd -- unseparated, date only
yyyy-MM-ddThh:mm:ss.fff -- date dash separated, date/time separated by T
Ancak, son zamanlarda dikkatime, herhangi bir dile ya da tarih formatı ayarına eşit derecede bağışık olan üçüncü bir format olduğuna dikkat çekildi:
yyyyMMdd hh:mm:ss.fff -- unseparated date, no T separator
TL; DR: Bu doğru. İçin datetime
ve smalldatetime
.
Daha uzun versiyon için ve okuma alacağınız kadar kanıt için okumaya devam edin.
Bunu açıklayan bir boşluk var - ana metin gövdesi yyyyMMdd hh:...
aktarılan dil veya tarih formatı yorumlamalarından güvenli bir format olarak kabul edemezken, böyle bir dizginin tarih kısmının tarih formatı ayarlarına bağlı olarak doğrulanmadığını söyleyen küçük bir bulanıklık var:
Belgeleri, sadece kendi sözleriyle almamın aksine, aksine. Biraz şüpheci olduğumu söyleyebilirsin. Dil burada da belirsizdir - sadece bunun alanı ve yeri açıkça söylememekle (tarihin ve saatin birleşimi olduğunu) (bildiğim kadarıyla bir taşıma dönüşü olabilir) olduğunu belirtir. Aynı zamanda çok dilli olmadığını, yani belli dillerde başarısız olabileceği anlamına geliyor, ama bunun da yanlış olduğunu kısaca anlayacağız.
Bu nedenle, hiçbir dil / tarih formatı kombinasyonunun bu belirli formatın başarısız olamayacağını kanıtlamaya başladım.
İlk önce, her dil için küçük bir dinamik SQL bloğu oluşturdum:
EXEC sys.sp_executesql @sql, N'@lang sysname', N'us_english';
Bu, bunun gibi 34 satır çıktı üretti:
EXEC sys.sp_executesql @sql, N'@lang sysname', N'us_english';
EXEC sys.sp_executesql @sql, N'@lang sysname', N'Deutsch';
EXEC sys.sp_executesql @sql, N'@lang sysname', N'Français';
EXEC sys.sp_executesql @sql, N'@lang sysname', N'日本語';
...
EXEC sys.sp_executesql @sql, N'@lang sysname', N'简体中文';
EXEC sys.sp_executesql @sql, N'@lang sysname', N'Arabic';
EXEC sys.sp_executesql @sql, N'@lang sysname', N'ไทย';
EXEC sys.sp_executesql @sql, N'@lang sysname', N'norsk (bokmål)';
Bu çıktıyı yeni bir sorgu penceresine kopyaladım ve üstünde, en azından bir durumda aynı tarihi (13 Mart) 13 ayın 3. gününe dönüştürmeyi deneyecek olan bu kodu oluşturdum:
DECLARE @sql nvarchar(max) = N'
SET LANGUAGE @lang;
SET DATEFORMAT ydm;
SELECT @@LANGUAGE, CONVERT(datetime, ''20170313 23:22:21.020'');';
Hayır, her dilin işe yaramadı ydm
. Diğer tüm formatları ve ayrıca her tarih / saat veri türünü denedim. Her zaman 13 Mart'a 34 başarılı dönüşüm.
Bu yüzden, @AndriyM ve @ErikE'e, gerçekten de 3. güvenli bir formatın olduğunu kabul ediyorum. Gelecekteki gönderiler için bunu aklımda tutacağım, ama diğer birçok yerdeki davulları pek çok yerde çarptım, hepsini avlamayacağım ve şimdi düzeltmeyeceğim.
Ek olarak, bunun güvenli olacağını düşünürsünüz, ama hayır:
yyyyMMddThh:mm:ss.fff -- unseparated date, T separator
Her dilde bunun eşdeğerini vereceğini düşünüyorum:
Mesaj 241, Seviye 16, Durum 1, Satır 8
Dönüştürme ,
tarih ve / veya saati karakter dizgisinden dönüştürürken başarısız oldu.
Bütünlüğü sağlamak için, orada dördüncü güvenli biçimidir, ancak yeni tarih / saat türlerine dönüşüm için yalnızca güvenlidir ( date
, datetime2
, datetimeoffset
). Bu durumlarda dil ayarları karışmaz:
yyyy-MM-dd hh:mm:...
Bununla birlikte, kullanımına karşı şiddetle tavsiye ediyorum, çünkü sadece yeni tipler için işe yarıyor ve eskiler de benim deneyimimde hala büyük miktarda kullanılıyor. Neden başka yerlerde (ya da veri türü değişirse aynı kodda, aslında aynı kodda) bunları kaldırmak zorunda kaldığınızda neden çizgiler var?
SET LANGUAGE Deutsch;
DECLARE @dashes char(10) = '2017-03-07 03:34';
DECLARE @d date = @dashes, @dt datetime = @dashes, @dt2 datetime2 = @dashes;
SELECT DATENAME(MONTH,@d), DATENAME(MONTH,@dt), DATENAME(MONTH,@dt2);
Aynı kaynak dizeye rağmen , dönüşümler oldukça farklı sonuçlar verdi:
März Juli März
Datetime ( yyyyMMdd
) için çalışan biçim her zaman tarih ve diğer yeni türler için de çalışır. Yani, IMHO, sadece her zaman bunu kullanın. Ve date / time ( yyyyMMdd hh:...
) tipindeki türler için üçüncü format verilmişse , bu aslında daha tutarlı olmanıza izin verir - tarih bileşeni her zaman biraz daha az okunabilir olsa bile.
Şimdi , tarihlerin sicim temsili hakkında konuşurken üç güvenli formatı gösterme alışkanlığına girmek bana sadece birkaç yıl sürecek .