文字列を日付に解析する方法は?


回答:




21

データベースがMSSQL Server 2012以降であると仮定すると、これが機能するソリューションです。基本的なステートメントには、インラインのtry-parseが含まれています。

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

実稼働バージョンで実装したものは次のとおりです。

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列とModifiedBy列は、内部データベース追跡のみを目的としています。

これらのMicrosoftMSDNリファレンスも参照してください。


これは、OPは、SQL Serverの2012+を使用していることを前提として
マーク・Kram

8

CONVERTは機能しますが、実際には使用しないでください。SQL-Serverで文字列値を解析する理由を自問する必要があります。これが一部のデータを手動で修正する1回限りのジョブであり、そのデータを再度取得しない場合、これは問題ありませんが、アプリケーションがこれを使用している場合は、何かを変更する必要があります。最良の方法は、「日付」データ型を使用することです。これがユーザー入力の場合、これはさらに悪いことです。次に、最初にクライアントでチェックを行う必要があります。SQL-Serverが日付を予期する場所に文字列値を本当に渡したい場合は、いつでもISO形式( 'YYYYMMDD')を使用でき、自動的に変換されます。


5
外部システムからデータファイルをインポートしていて、入力列が「05/31/2013」などのこれらの形式のいずれかであるが、文字列として入力される状況はどうでしょうか。そして、たとえば、そのデータをインポートするためのストアドプロシージャを作成しているのですか、それともSSISを使用してデータをインポートしているのですか?それなら、CONVERTを使用するのが適切でしょう。
デビッド・バロウズ

必ずしも、トランザクションモデルではなく、MS SQL Serverが分析データモデルをホストしている状況では、日付タイプとしてすぐに入力されない多くの外部ソースを処理する必要があるため、CONVERTを使用してもまったく問題ありません。 (DavidBarrowsが上記でほのめかしたように)。
2014年

日付のデフォルトの文字列リテラル形式はYYYY-MM-
YB


1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

必要なことを実行します、結果:

2012-04-24 00:00:00.000

これは、言語設定が異なっていても、OPが投稿したものでは機能しないようです。それを試してみてください。それが実際に機能する場合は、現在の言語設定を投稿してください。ありがとう。試すコードは次のとおりです... SELECT CONVERT(DateTime、'24 .04.2012 '、121)AS ExpireDate
Jeff
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.