12

データを日時形式で格納する列があります。この列の時間部分が00:00:00:000と等しくないすべてのインスタンスをチェックしたいのですが、日付は関係ありません。

基本的に、time()が関数の場合、次のようになります。

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

どうすればこれを行うことができますか?

4

5 に答える 5

17

すでに持っているものを少し調整するだけです。

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'
于 2013-02-27T06:26:01.233 に答える
3

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へのキャストは使用できません。

于 2013-02-27T05:46:41.030 に答える
3

別の方法は、それを別のデータ型に変換することです。

SELECT  *
FROM    progen.DY
WHERE   CAST(DY_DATE as float) - CAST(DY_DATE as int) > 0
于 2013-02-27T05:52:11.490 に答える
3

テーブルの列を日時ではなく日付に変換する必要があるかどうかを確認しようとするときに、これを常に行います。これが実際の答えです。

select *
from progen.dy
where cast(dy_date as Date) <> dy_date

キャストは時刻を削除し、日時の優先順位が高くなるため、比較すると、が等しくない場合は時刻の値になります。同じことが、少し異なる構文を使用して、時間に合わせてキャストすることでも実行できます。

于 2013-02-27T05:54:43.790 に答える
2
SELECT * 
FROM progen.DY 
WHERE CONVERT(TIME, DY_DATE - CONVERT(DATE, DY_DATE)) > '00:00'
于 2013-02-27T05:48:53.937 に答える