Dize tarihe nasıl ayrıştırılır?


Yanıtlar:




22

Veritabanının MS SQL Server 2012 veya üzeri olduğunu varsayarsak, işte çalışan bir çözüm. Temel ifade, satır içi deneme ayrıştırmasını içerir:

SELECT TRY_PARSE('02/04/2016 10:52:00' AS datetime USING 'en-US') AS Result;

Üretim sürümünde uyguladıklarımız:

UPDATE dbo.StagingInputReview
 SET ReviewedOn = 
     ISNULL(TRY_PARSE(RTrim(LTrim(ReviewedOnText)) AS datetime USING 'en-US'), getdate()),
 ModifiedOn = (getdate()), ModifiedBy = (suser_sname())
 -- Check for empty/null/'NULL' text
 WHERE not ReviewedOnText is null 
   AND RTrim(LTrim(ReviewedOnText))<>''
   AND Replace(RTrim(LTrim(ReviewedOnText)),'''','') <> 'NULL';

ModifiedOn ve ModifiedBy sütunları, yalnızca dahili veritabanı izleme amaçları içindir.

Ayrıca şu Microsoft MSDN referanslarına bakın:


Bu, OP'nin Sql Server 2012+ kullandığını varsayar
Mark Kram

8

CONVERT şeyi işe yarasa da, aslında onu kullanmamalısınız. Neden SQL-Server'da dize değerlerini ayrıştırdığınızı kendinize sormalısınız. Bu, bazı verileri manuel olarak düzelttiğiniz tek seferlik bir işse, bu verileri başka bir zaman alamazsınız, sorun değil, ancak herhangi bir uygulama bunu kullanıyorsa, bir şeyi değiştirmelisiniz. En iyi yol, "tarih" veri türünü kullanmaktır. Bu kullanıcı girdisi ise, bu daha da kötüdür. O zaman önce istemcide bazı kontroller yapmalısınız. SQL-Server'ın bir tarih beklediği dize değerlerini gerçekten geçirmek istiyorsanız, her zaman ISO biçimini ('YYYYAAGG') kullanabilirsiniz ve otomatik olarak dönüştürmesi gerekir.


5
Bazı harici sistemlerden veri dosyalarını içe aktardığınız ve giriş sütununun bu biçimlerden birinde olduğu, örneğin "31.05.2013", ancak dizge olarak gelen bir duruma ne dersiniz? Ve diyelim ki, bu verileri içeri aktarmak için bir saklı yordam mı yazıyorsunuz, yoksa SSIS kullanarak mı? O zaman CONVERT, kullanılacak uygun şey olur, değil mi?
David Barrows

Mutlaka değil, MS SQL Server'ın analitik veri modellerini barındırdığı durumlarda, işlem modellerinin aksine, CONVERT kullanmak tamamen uygundur çünkü bir tarih türü olarak hemen gelmeyecek birçok harici kaynakla uğraşmak zorundadır. (David Barrows'un yukarıda ima ettiği gibi).
Will

Tarihler için varsayılan dize değişmez biçimi YYYY-AA-GG
YB


1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

gerekeni yapacak, sonuç:

2012-04-24 00:00:00.000

Bu, farklı dil ayarları için bile OP'nin yayınladıkları için işe yaramıyor gibi görünüyor. Dene. Aslında sizin için çalışıyorsa, lütfen mevcut dil ayarınızı yayınlayın. Teşekkürler. İşte deneyebileceğiniz kod ... SELECT CONVERT (DateTime, '24 .04.2012 ', 121) OLARAK ExpireDate
Jeff Moden
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.