MS SQLの日付を比較しますか?


86

私は2つの日付(日時)を持っています:

date1 = 2010-12-31 15:13:48.593
date2 = 2010-12-31 00:00:00.000

その同じ日、ちょうど異なる時間。<=を使用してdate1とdate2を比較することは、date1の時間のために機能しません。したがって、date1 <= date2は間違っていますが、正しいはずです。年、月、日だけを見て同じになるように比較できますか?そのSQLServer2008。

ありがとう:)


SQL Serverのバージョンは何ですか?この比較をどのようなコンテキストで行っていますか(列と比較する場合は、物事を保管可能に保つように注意する必要があります)?
マーティンスミス

私はこれを「選択したケース」で行っています。日付が<=の場合はこれを行い、そうでない場合はこれを行います。その
SQLServer

比較が失敗するために、あなたの日付は文字列として保存されているようです。それらが日時として保存された場合、私は比較を推測します
パスカル2011年

date1 <= date2 = true?午後3時は午前12時未満ですか?
4ままカバー

回答:


88
SELECT CASE WHEN CAST(date1 AS DATE) <= CAST(date2 AS DATE) ...

あなたが必要なことをする必要があります。

テストケース

WITH dates(date1, date2, date3, date4)
     AS (SELECT CAST('20101231 15:13:48.593' AS DATETIME),
                CAST('20101231 00:00:00.000' AS DATETIME),
                CAST('20101231 15:13:48.593' AS DATETIME),
                CAST('20101231 00:00:00.000' AS DATETIME))
SELECT CASE
         WHEN CAST(date1 AS DATE) <= CAST(date2 AS DATE) THEN 'Y'
         ELSE 'N'
       END AS COMPARISON_WITH_CAST,
       CASE
         WHEN date3 <= date4 THEN 'Y'
         ELSE 'N'
       END AS COMPARISON_WITHOUT_CAST
FROM   dates 

戻り値

COMPARISON_WITH_CAST   |  COMPARISON_WITHOUT_CAST
Y                         N

1
ことに注意してくださいDATEタイプは、SQL Server 2008の前には利用できませんでした
LukeH

@ルーク-うん。したがって、OPがどのバージョンにあるかについての私のクエリ。
マーティンスミス

@ grady-はい、そうです!テストケースを参照してください。これは、あなたが望むことを正確に実行します。
マーティンスミス

68

DATEDIFF日付部分で関数を使用しますday

SELECT ...
FROM ...
WHERE DATEDIFF(day, date1, date2) >= 0

注あなたがいることをテストする場合は、そのdate1<= date2、あなたはそれをテストする必要があるDATEDIFF(day, date1, date2) >= 0か、あるいはあなたがテストすることができDATEDIFF(day, date2, date1) <= 0


これは機能しますが、理由を説明できますか?それは単に日を比較しているだけではありませんか?
grady 2011年

1
@grady:いいえ、との間の日の境界の数をカウントします。であること、深夜の数は、あなたから取得するために通過したいとdate1date2date1date2
LukeH

5
+1ここで最もエレガントなソリューション。
日付

3

単純な1行のソリューションは

datediff(dd,'2010-12-31 15:13:48.593','2010-12-31 00:00:00.000')=0

datediff(dd,'2010-12-31 15:13:48.593','2010-12-31 00:00:00.000')<=1

datediff(dd,'2010-12-31 15:13:48.593','2010-12-31 00:00:00.000')>=1

「dd」以外のいろいろなオプションを試すことができます


0

これを試して:

BEGIN

declare @Date1 datetime
declare @Date2 datetime

declare @chkYear int
declare @chkMonth int
declare @chkDay int
declare @chkHour int
declare @chkMinute int
declare @chkSecond int
declare @chkMiliSecond int

set @Date1='2010-12-31 15:13:48.593'
set @Date2='2010-12-31 00:00:00.000'

set @chkYear=datediff(yyyy,@Date1,@Date2)
set @chkMonth=datediff(mm,@Date1,@Date2)
set @chkDay=datediff(dd,@Date1,@Date2)
set @chkHour=datediff(hh,@Date1,@Date2)
set @chkMinute=datediff(mi,@Date1,@Date2)
set @chkSecond=datediff(ss,@Date1,@Date2)
set @chkMiliSecond=datediff(ms,@Date1,@Date2)

if @chkYear=0 AND @chkMonth=0 AND @chkDay=0 AND @chkHour=0 AND @chkMinute=0 AND @chkSecond=0 AND @chkMiliSecond=0
    Begin
        Print 'Both Date is Same'
    end
else
    Begin
        Print 'Both Date is not Same'
    end
End

0

私は常にDateDiff(day、date1、date2)を使用して2つの日付を比較します。

次の例をチェックアウトします。それをコピーして、Mssqlサーバーで実行するだけです。また、12月31日から12月30日までの変更日を試して結果を確認してください

BEGIN

declare @firstDate datetime
declare @secondDate datetime


declare @chkDay int

set @firstDate ='2010-12-31 15:13:48.593'
set @secondDate ='2010-12-31 00:00:00.000'

set @chkDay=Datediff(day,@firstDate ,@secondDate )

if @chkDay=0
    Begin
        Print 'Date is Same'
    end
else
    Begin
        Print 'Date is not Same'
    end
End
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.