私はこのような文字列を変換したいです。
'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')
この質問 は、文字列を 標準形式 のいずれかに解析してから、それらのコードのいずれかを使用して変換する必要があることを意味します。それはそのような平凡な操作のためにばかげているようです。もっと簡単な方法はありますか?
SQL Server(2005、2000、7.0)には、任意の構造化された日付時刻を文字列形式で取得し、それを日付時刻データ型に変換するための柔軟な方法、あるいは柔軟でない方法さえありません。
「任意に」とは、「それを書いた人が、おそらくあなたや私、あるいは地球の反対側にいる人ではないかもしれないが、直感的で完全に自明であると考える形式」を意味する。率直に言って、そのようなアルゴリズムがあるかどうかはわかりません。
これを試して
Cast('7/7/2011' as datetime)
そして
Convert(varchar(30),'7/7/2011',102)
詳細については、 CASTおよびCONVERT(Transact-SQL) を参照してください。
クエリプロセッサを介してこれを実行します。それは日付や時間をそのようにフォーマットします、そして、これらのうちの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)'
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を使用することはできません。
この問題に対して私が使用する最良の解決策は、指定されたフォーマットでDateTime値を返すためにDateTime.ParseまたはParseExact関数のいずれかを使用するSql Server 2005のCLR関数を持つことです。
試してみませんか
select convert(date,'10/15/2011 00:00:00',104) as [MM/dd/YYYY]
これを使って:
SELECT convert(datetime, '2018-10-25 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm
変換コードについては、 公式ドキュメント の表を参照してください。
個人的には、任意のフォーマットや完全にオフウォールのフォーマットを扱う場合、それらが前もって何があるのか知っているのであれば、単にregexpを使って必要な日付のセクションを取り出し、有効なdate/datetimeコンポーネントを形成します。
この ページ には、CONVERT関数で使用可能な指定されたすべての日時変換についての参照がいくつかあります。あなたの値が許容可能なパターンの1つに入らないなら、私は最良のことはParseExactルートを進むことであると思います。
SQL Serverに試してみてもらいたい場合は、CAST CAST( 'whatever' AS datetime)を使用してください。国際日付に関する問題が出てくるでしょう。そのため、これらの問題を回避するには、日付のODBC正規形式を使用します。つまり、フォーマット番号120、20はちょうど2桁の年のフォーマットです。 SQL Serverには、ユーザー指定の形式を提供できるようにする組み込み関数があるとは思いません。あなたはあなた自身のものを書くことができ、あなたがオンラインで検索するならばものさえ見つけるかもしれません。