2016-09-07 248 views
0
IF('08/30/2015'>'08/29/2016') 
SELECT '1' 
ELSE 
SELECT '0' 

このSQL文は、月と日のみを比較し、年を無視するため1を返します。私は、日付ではなく2つのvarchar値を比較していることを知っていますが、この比較のためにSQLロジックがどのようなものになるかを知りたいのですが?varchar形式の日付比較

誰でも助けてくれますか?この同じシナリオでは、プロジェクトで問題が発生し、現在までキャスティングすることで解決しました。しかし、私はこの背後にある論理を知りたい。私はそれを捜したが、適切な説明を見つけられなかった。

+2

文字列として自然に比較します。文字を1文字ずつ比較します。最初は3対2、3は2より大きいため、結果は1です。 –

答えて

0

これは2つの文字列を比較しているため、人間がこれらを見て日付を考えるにしても、SQLは文字列が別の文字列より大きいとみなします。あなたがスラッシュを取り出して数字をそこに置くと、より意味をなさされるかもしれません:08302015 > 08292016

+0

これは、年の前の月と日でソートされるため、機能しません。あなたの例は、2015は2016よりも実際にはそれほど大きくはありませんか?) – Ben

+0

@Ben私はこれを計算として提案するのではなく、提示された値を比較する際のロジックの働きについて質問します。彼はすでに、キャスティングで正しく解決する日程を得ていると述べています。その理由は、文字列が計算された方法で計算される理由です。スラッシュを外に出すことで、私はコミュニケーションしようとしていた人間にそれを明確にすることができます。たぶんあなたは質問をもっと慎重に読むべきでしょう。 – morgb

+0

私の悪い。だから私は私のdownvoteを削除することはできません。申し訳ありません。 – Ben

4

あなたの値は日付ではありません。彼らは文字列です。

をしかし、なぜわざわざ:(これは日付フォーマットのためのあなたの国際化の設定に依存してもよい働くかどうかは、私はそれがMDY形式を理解するように設定されていると仮定します。注意してください。)

IF (convert(date, '08/30/2015') > convert(date, '08/29/2016')) 
    SELECT '1' 
ELSE 
    SELECT '0'; 

:あなたは何ができますか?

IF ('2015-08-30' > '2015-08-29') 
    SELECT '1' 
ELSE 
    SELECT '0'; 

これは、文字列が正しく比較されるため、変換が必要ないため、ISO標準日付形式(YYYY-MM-DD)を使用してください。