1

Sql Server 2005でvarcharをdatetimeに変換しています。提供されたvarcharの形式が予期しない場合、Sql Serverを強制的に失敗させることはできますか?

例:

select convert(datetime, '01-2010-02', 103) 

期待される結果:103はdd / mm / yyyyを意味するため、クエリは失敗します(msdnを参照)。

実際の結果:2010-02-01 00:00:00.000

要求された施行の主な目的は、日と月の順序です。varcharがyyyy-mm-ddの形式で提供されている場合、提供された形式(dd / mm / yyyy)の日/月の順序により、SQL Serverはmmを日として扱い、ddを月として扱います。

:このケースを手動で処理するカスタム関数を作成できます。しかし、そのようなエンタープライズDBがすでにデータを厳密に処理できることを願っています。

4

3 に答える 3

0

SQL Server が Year の明確な候補を見つけると、常にそれが Year として使用されます。

残りの DM パートは、DMY 設定または変換フォーマット内の順序から決定されます。そうでない場合、非常に単純な変換がうまくいかなくなります。

set dateformat dmy
select 1 a,CONVERT(datetime, '1-2-3') b
union all
select 2,CONVERT(datetime, '2001-2-3')
union all
select 3,CONVERT(datetime, '2001-3-2')

出力

a           b
----------- -----------------------
1           2003-02-01 00:00:00.000
2           2001-03-02 00:00:00.000
3           2001-02-03 00:00:00.000

2番目と3番目は明示的に年を前に置きますが、それで問題ありません


編集

Books Online には、http://msdn.microsoft.com/en-us/library/ms180878.aspx#StringLiteralDateandTimeFormatsと書かれています。

CONVERT の 3 番目のパラメーターに関係なく役割を果たす SET DATEFORMAT にはかなりの数の例外があります。

  • SET DATEFORMAT セッション設定は、すべて数値の日付エントリには適用されません
  • この [ISO 8601] 形式は、ログインのデフォルト言語設定の SET DATEFORMAT、SET LANGUAGE の影響を受けません。
  • 月をアルファベット形式で指定すると、SET DATEFORMAT セッション設定は適用されません。

具体的に dd/mm/yyyy を検証するには、代わりに以下を使用します

set dateformat dmy
declare @input varchar(10) set @input = '12-2010-01'

-- convert allows the date through
select convert(datetime, @input, 103) -- 2010-01-12 00:00:00.000

-- the case below returns 0 { = invalid date }
-- this uses 8-digit format which is always interpreted YYYYMMDD regardless
-- of language or dateformat settings
select case
    when @input not like '__/__/____' then 0
    else isdate(right(@input,4)+right(left(@input,5),2)+left(@input,2))
    end
于 2011-02-24T18:29:47.800 に答える
0

残念ながら、 CLR 関数を使用し、 DateTime.TryParseExactメソッドを利用する必要があります。エレガントなソリューションではありませんが、機能する可能性があります。

于 2011-02-24T18:27:22.357 に答える
0

日付を日時に変換して比較し、再び戻すことができます。このような落とし穴があるかどうかはわかりませんが、私の限られたテストでは何も発見されていません。

if @StrDate = convert(varchar(10), convert(datetime, @StrDate, 103) ,103)
于 2011-02-24T18:57:41.793 に答える