2016-07-14 11 views
0

enter image description here私は2つの値、期間番号と対応する日付のクエリを作成しています。期間は、類似しているが当社の月と同一ではない会計期間である。日付は大体正しいですが、私はWHEREステートメントでクリーンアップすると思ったいくつかの矛盾があります。WHERE句のSQLサーバー日時問題

例えば、日付2015年4月1日は、期間3に属しているが、それはこの問題を解決するには、両方の期間3と期間4に現れ、私は私が述べてWHEREステートメントを作成するだろうと考えた:

SELECT DISTINCT table1.period, 
       table1.datetime 
FROM table1 
WHERE table1.period <> 4 AND table1.datetime <> '4/1/2015' 

これは、私が必要としていたものの代わりに、すべての期間4を取り去ったものです。私はまた、日時の構文を試してみました:

AND table1.datetime <> '20150401 00:00:00.000' 

どちらの構文も同じ結果でした。私はSQLでかなり経験がなく、日時の値を扱うことを常に嫌っていたので、どんな助けも素晴らしいでしょう。

-EDIT-最初のdatetime WHERE句に一重引用符を追加するのを忘れました。

+0

これはtable1.datetimeのタイプですか? –

+0

@alexこれはdatetimeデータ型であり、ピリオドは文字列です。 – GHINOTE

+1

日付の時刻値はありますか?日付文字列と比較すると日付としてキャストする必要があるかもしれません。 '04/1/2015 01:00:00.000'は '4/1/2015'とは異なりますが、CAST( '4/1/2015 01:00:00.000' AS DATE)と同じです。 – BinaryPatrick

答えて

1

を試すことができます。

SELECT DISTINCT table1.period, 
      table1.datetime 
FROM table1 
WHERE CASE WHEN table1.period = 4 AND CONVERT(VARCHAR(8),table1.datetime,112) = '20150401' THEN 1 ELSE 0 END = 0 

これだけあなたのクエリは最初period=4を持っているものを取り除くながら両方が、period=4datetime=20150401を持っている行を取り除きます([datetime]が何であっても)何かを取り除くと、datetime=20150401があります。

+0

ケースステートメントは、ORを使用している場合にのみ出力を変更します。 AND条件が同じに評価されるステートメント。 ANDステートメントでそれらを持つことは、両方がセット内に留まるために真でなければならないことを意味する – BinaryPatrick

+0

これは機能します。申し訳ありませんが、私はまだupvoteできません。 – GHINOTE

0

期間は文字列フィールドですか?あなたはvarcharを意味しますか?
また、時刻ではなく日付部分だけをチェックしたいですか?

、あなたは、次の試してみてください。この

SELECT DISTINCT table1.period, 
       table1.datetime 
FROM table1 
WHERE table1.period <> '4' 
AND convert(date, table1.datetime) <> '20150401' 
+0

これは、他のすべての期間4の日付を保持しながら期間4(2015年4月1日)を取り除くことにも役立ちますが、正しい日付である期間3(2015年4月1日)も取り除きます。 – GHINOTE

+0

OKあなたが望むものはあまり明確ではありませんでした – GuidoG