web-dev-qa-db-ja.com

SQL Serverの文字列から日付への変換

私はこのような文字列を変換したいです。

'10/15/2008 10:06:32 PM'

sql Serverの同等のDATETIME値に。

Oracleでは、私はこれを言うだろう:

TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')

この質問 は、文字列を 標準形式 のいずれかに解析してから、それらのコードのいずれかを使用して変換する必要があることを意味します。それはそのような平凡な操作のためにばかげているようです。もっと簡単な方法はありますか?

156
JosephStyons

SQL Server(2005、2000、7.0)には、任意の構造化された日付時刻を文字列形式で取得し、それを日付時刻データ型に変換するための柔軟な方法、あるいは柔軟でない方法さえありません。

「任意に」とは、「それを書いた人が、おそらくあなたや私、あるいは地球の反対側にいる人ではないかもしれないが、直感的で完全に自明であると考える形式」を意味する。率直に言って、そのようなアルゴリズムがあるかどうかはわかりません。

30
Philip Kelley

これを試して

Cast('7/7/2011' as datetime)

そして

Convert(varchar(30),'7/7/2011',102)

詳細については、 CASTおよびCONVERT(Transact-SQL) を参照してください。

263
gauravg

クエリプロセッサを介してこれを実行します。それは日付や時間をそのようにフォーマットします、そして、これらのうちの1つはあなたが探しているものをあなたに与えるべきです。適応するのは難しいことではありません。

Declare @d datetime
select @d = getdate()

select @d as OriginalDate,
convert(varchar,@d,100) as ConvertedDate,
100 as FormatValue,
'mon dd yyyy hh:miAM (or PM)' as OutputFormat
union all
select @d,convert(varchar,@d,101),101,'mm/dd/yy'
union all
select @d,convert(varchar,@d,102),102,'yy.mm.dd'
union all
select @d,convert(varchar,@d,103),103,'dd/mm/yy'
union all
select @d,convert(varchar,@d,104),104,'dd.mm.yy'
union all
select @d,convert(varchar,@d,105),105,'dd-mm-yy'
union all
select @d,convert(varchar,@d,106),106,'dd mon yy'
union all
select @d,convert(varchar,@d,107),107,'Mon dd, yy'
union all
select @d,convert(varchar,@d,108),108,'hh:mm:ss'
union all
select @d,convert(varchar,@d,109),109,'mon dd yyyy hh:mi:ss:mmmAM (or PM)'
union all
select @d,convert(varchar,@d,110),110,'mm-dd-yy'
union all
select @d,convert(varchar,@d,111),111,'yy/mm/dd'
union all
select @d,convert(varchar,@d,12),12,'yymmdd'
union all
select @d,convert(varchar,@d,112),112,'yyyymmdd'
union all
select @d,convert(varchar,@d,113),113,'dd mon yyyy hh:mm:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,114),114,'hh:mi:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,120),120,'yyyy-mm-dd hh:mi:ss(24h)'
union all
select @d,convert(varchar,@d,121),121,'yyyy-mm-dd hh:mi:ss.mmm(24h)'
union all
select @d,convert(varchar,@d,126),126,'yyyy-mm-dd Thh:mm:ss:mmm(no spaces)'
45
Taptronic

SQL Server Denaliでは、あなたが探しているものに近い何かをすることができるでしょう。しかし、あなたはまだ任意に定義された不正な日付文字列を渡すことはできず、SQL Serverが対応することを期待できません。これはあなたがあなた自身の答えに投稿したものを使った一例です。 FORMAT()関数は、オプションの引数としてロケールを受け入れることもできます。これは.Netのフォーマットに基づいているため、表示されるはずのトークンフォーマットのすべてではないにしてもほとんどが存在します。

DECLARE @d DATETIME = '2008-10-13 18:45:19';

-- returns Oct-13/2008 18:45:19:
SELECT FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss');

-- returns NULL if the conversion fails:
SELECT TRY_PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

-- returns an error if the conversion fails:
SELECT PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

私はあなたがもっと管理してあなたの日付入力を消毒することを強く勧めます。フリーテキストのフォームフィールドに好きな形式を使って日付を入力させる日々は、今ではもう少し遅れているはずです。誰かが2011年8月9日に入った場合、その8月9日と9月8日のどちらですか?カレンダーコントロールで日付を選択させると、アプリでフォーマットを制御できます。いくらユーザーの行動を予測しようとしても、計画していなかった日付を入力するための厄介な方法を常に見つけ出します。

しかし、Denaliまでは、@ Ovidiuがこれまでで最高のアドバイスを持っていると思います。これはあなた自身のCLR関数を実装することによってかなり簡単にすることができます。それから、あなたが望むだけの風変わりな非標準フォーマットのためにケース/スイッチを書くことができます。


@ dhergertの更新

SELECT TRY_PARSE('10/15/2008 10:06:32 PM' AS DATETIME USING 'en-us');
SELECT TRY_PARSE('15/10/2008 10:06:32 PM' AS DATETIME USING 'en-gb');

結果:

2008-10-15 22:06:32.000
2008-10-15 22:06:32.000

あなたはまだ他の重要な情報を最初に持っている必要があります。 6/9/2012が6月9日なのか9月6日なのかを判断するためにネイティブT-SQLを使用することはできません。

40
Aaron Bertrand

この問題に対して私が使用する最良の解決策は、指定されたフォーマットでDateTime値を返すためにDateTime.ParseまたはParseExact関数のいずれかを使用するSql Server 2005のCLR関数を持つことです。

10
Ovidiu Pacurar

試してみませんか

select convert(date,'10/15/2011 00:00:00',104) as [MM/dd/YYYY]

日付形式は、 で確認できます。SQL Server Helper> SQL Serverの日付形式

8
Scott Gollaglee

これを使って:

SELECT convert(datetime, '2018-10-25 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm

変換コードについては、 公式ドキュメント の表を参照してください。

5
Simone

個人的には、任意のフォーマットや完全にオフウォールのフォーマットを扱う場合、それらが前もって何があるのか​​知っているのであれば、単にregexpを使って必要な日付のセクションを取り出し、有効なdate/datetimeコンポーネントを形成します。

2
SyWill

この ページ には、CONVERT関数で使用可能な指定されたすべての日時変換についての参照がいくつかあります。あなたの値が許容可能なパターンの1つに入らないなら、私は最良のことはParseExactルートを進むことであると思います。

2
tvanfosson

SQL Serverに試してみてもらいたい場合は、CAST CAST( 'whatever' AS datetime)を使用してください。国際日付に関する問題が出てくるでしょう。そのため、これらの問題を回避するには、日付のODBC正規形式を使用します。つまり、フォーマット番号120、20はちょうど2桁の年のフォーマットです。 SQL Serverには、ユーザー指定の形式を提供できるようにする組み込み関数があるとは思いません。あなたはあなた自身のものを書くことができ、あなたがオンラインで検索するならばものさえ見つけるかもしれません。

0
Will Rickards