205

次のように文字列を変換したい:

'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')

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

4

17 に答える 17

335

これを試して

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

 Convert(DATETIME, '7/7/2011', 101)

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

于 2011-08-24T12:26:05.590 に答える
54

これをクエリ プロセッサで実行します。日付や時刻をそのようにフォーマットし、これらのいずれかが探しているものを提供するはずです。適応するのは難しくありません:

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)'
于 2008-10-16T02:30:50.377 に答える
50

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 日ですか? カレンダー コントロールで日付を選択させると、アプリで形式を制御できます。ユーザーの行動をどれだけ予測しようとしても、ユーザーは常に、計画していなかった日付を入力する愚かな方法を見つけ出します。

ただし、デナリまでは、@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ネイティブ T-SQL を使用して、 6 月 9 日か 9 月 6 日かを判断することはできません。

于 2011-08-25T00:43:01.247 に答える
33

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

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

于 2008-10-29T20:33:16.700 に答える
11

この問題に対して私が使用する最善の解決策は、Sql Server 2005 で DateTime.Parse または ParseExact 関数のいずれかを使用して指定された形式で DateTime 値を返す CLR 関数を使用することです。

于 2008-10-16T02:29:47.163 に答える
8

簡潔な答え:

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

その他の日付形式は、SQL Server Helper > SQL Server Date Formatsにあります。

于 2011-08-23T14:22:53.310 に答える
3

このページには、CONVERT 関数で使用できる指定されたすべての日時変換に関するリファレンスがいくつかあります。値が許容可能なパターンのいずれにも当てはまらない場合、最善の方法は ParseExact ルートに進むことだと思います。

于 2008-10-16T02:53:39.283 に答える
3

個人的には、任意または完全に壁から外れた形式を扱う場合、それらが事前に何であるか、またはこれからどうなるかを知っていれば、単に正規表現を使用して必要な日付のセクションを取得し、有効な日付/日時コンポーネントを形成します。

于 2012-04-01T15:32:45.073 に答える
1

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

于 2008-10-16T02:50:26.717 に答える
-4
dateadd(day,0,'10/15/2008 10:06:32 PM')
于 2019-11-20T14:09:34.567 に答える