2013-02-27 4 views
7

データをdatetime形式で格納する列があります。私は、この列の時間部分が00:00:00:000に等しくないすべてのインスタンスをチェックしたい。日付は重要ではない。どのように私はこれをやって行くのです日時フィールドの時刻を確認するだけですが、日付は無視しますか?

SELECT * 
FROM progen.DY 
WHERE TIME(DY_DATE) <> '00:00:00:000' 

は基本的には、時間であれば()、このような何かの機能でしたか?

答えて

9

あなたは既に持っているものをマイナーチェイクするだけで済みます。

SELECT * 
FROM progen.DY 
WHERE TIME(DY_DATE) <> '00:00:00:000' 

使用CONVERTTIMEにごDATETIMEを変更します。

SELECT * 
FROM progen.DY 
WHERE CONVERT(TIME, DY_DATE) <> '00:00:00:000' 
+0

この方法には制限事項がありますか?これが本当に最善の方法である場合、これは(他の回答に基づいて)提案されるまでには時間がかかりました。 – Codingo

+0

@Michael他の回答と比較しても、このような制限はありません。そのような列に関数を適用することについて悪い点は、その列のインデックスは使用できず、SQL Serverは必要な行を特定するためにテーブルスキャンを実行する必要があるということです。 –

3

代わりにDATEDIFFDATEADDを使用して、datetimeの日付部分を取得します。列と日付のみを比較すると、ゼロ以外の時間を持つ行が戻されます。

この方法は、最初にエポックと値の差(日数)を計算する方法です。新しいdatetimeを作成するために、その番号をエポックに追加します。 DATEDIFFの結果は整数なので、時間成分は四捨五入されます。

SELECT * 
FROM Table 
WHERE DateColumn <> DATEADD(d, DATEDIFF(d, 0, DateColumn), 0) 

時間関数は、その後、以下で実現することができ、私は、この特定のシナリオのためにそれをお勧めしませんということ:

SELECT DATEDIFF(minute, DATEADD(d, DATEDIFF(d, 0, DateColumn), 0), DateColumn) as MinutesIntoDay, 
    -- or, if you require higher precision 
    DATEDIFF(second, DATEADD(d, DATEDIFF(d, 0, DateColumn), 0), DateColumn) as MinutesIntoDay 
FROM Table 

編集:他の回答で述べたように、することができますDATEにキャストして、DATEADD(d, DATEDIFF(d, 0, DateColumn), 0)と同じ効果を達成します。これはうまくクリーンアップします。ただし、DATEはSQL Server 2008にのみ追加されましたが、数式には少なくともSQL 2000との互換性があります。したがって、下位互換性が必要な場合やSQL CEを扱う場合は、DATEにキャストすることはできません。

2
SELECT * 
FROM progen.DY 
WHERE CONVERT(TIME, DY_DATE - CONVERT(DATE, DY_DATE)) > '00:00' 
3

別の方法は、異なるデータ型に変換することです例えば

SELECT * 
FROM progen.DY 
WHERE CAST(DY_DATE as float) - CAST(DY_DATE as int) > 0 
2

私はこれをテーブルの列がどうあるべきかどうかを確認しようとしているすべての時間を行います日時の代わりに日付に変えられました。これは本当に答えです。

キャストは時間を削除し、datetimeの方が優先順位が高いため、比較すると、それらが等しくない場合は時間値があります。同じことが、異なる構文のビットを使って、時間に合わせてキャストすることができます。

関連する問題