データを日時形式で格納する列があります。この列の時間部分が00:00:00:000と等しくないすべてのインスタンスをチェックしたいのですが、日付は関係ありません。
基本的に、time()が関数の場合、次のようになります。
SELECT *
FROM progen.DY
WHERE TIME(DY_DATE) <> '00:00:00:000'
どうすればこれを行うことができますか?
データを日時形式で格納する列があります。この列の時間部分が00:00:00:000と等しくないすべてのインスタンスをチェックしたいのですが、日付は関係ありません。
基本的に、time()が関数の場合、次のようになります。
SELECT *
FROM progen.DY
WHERE TIME(DY_DATE) <> '00:00:00:000'
どうすればこれを行うことができますか?
すでに持っているものを少し調整するだけです。
SELECT *
FROM progen.DY
WHERE TIME(DY_DATE) <> '00:00:00:000'
CONVERTを使用しDATETIME
て、をに変更しますTIME
。
SELECT *
FROM progen.DY
WHERE CONVERT(TIME, DY_DATE) <> '00:00:00:000'
DATEDIFF
代わりにとを使用しDATEADD
て、日時の日付部分を取得します。列を日付のみと比較すると、時刻がゼロ以外の行が返されます。
これが機能する方法は、最初にエポックと値の差(日数)を計算することです。その番号をエポックに追加して、新しい日時を作成します。の結果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へのキャストは使用できません。
別の方法は、それを別のデータ型に変換することです。
SELECT *
FROM progen.DY
WHERE CAST(DY_DATE as float) - CAST(DY_DATE as int) > 0
テーブルの列を日時ではなく日付に変換する必要があるかどうかを確認しようとするときに、これを常に行います。これが実際の答えです。
select *
from progen.dy
where cast(dy_date as Date) <> dy_date
キャストは時刻を削除し、日時の優先順位が高くなるため、比較すると、が等しくない場合は時刻の値になります。同じことが、少し異なる構文を使用して、時間に合わせてキャストすることでも実行できます。
SELECT *
FROM progen.DY
WHERE CONVERT(TIME, DY_DATE - CONVERT(DATE, DY_DATE)) > '00:00'