MS SQL membandingkan tanggal?

88

Saya memiliki 2 tanggal (waktu):

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

Ini hari yang sama, hanya waktu yang berbeda. Membandingkan tanggal1 dan tanggal2 menggunakan <= tidak berfungsi karena waktu tanggal1. Jadi tanggal1 <= tanggal2 salah, tetapi seharusnya benar. Dapatkah saya membandingkannya dengan hanya melihat tahun, bulan, dan hari sehingga sama? SQL Server 2008-nya.

Terima kasih :)

grady
sumber
Versi SQL Server berapa? Dalam konteks apa Anda melakukan perbandingan ini (jika Anda membandingkan dengan kolom, Anda harus berhati-hati untuk menjaga agar hal-hal tetap terjangkau)?
Martin Smith
Saya melakukan ini dalam "kasus pilih". Jika tanggalnya <= lakukan ini, jika tidak, lakukan itu. SQL Server 2008
grady
Agar perbandingan gagal, tampaknya tanggal Anda disimpan sebagai string. Jika mereka disimpan sebagai datetime, saya kira perbandingannya
pascal
tanggal1 <= tanggal2 = benar? bagaimana 3PM kurang dari 12AM?
4 Tinggalkan Sampul

Jawaban:

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

Harus melakukan apa yang Anda butuhkan.

Kasus cobaan

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 

Kembali

COMPARISON_WITH_CAST   |  COMPARISON_WITHOUT_CAST
Y                         N
Martin Smith
sumber
1
Perhatikan bahwa DATEtipe tidak tersedia sebelum SQL Server 2008.
LukeH
@ Luke - Ya. Oleh karena itu pertanyaan saya tentang versi OP apa yang aktif.
Martin Smith
@grady - Ya, benar! Lihat kasus uji ini melakukan apa yang Anda inginkan!
Martin Smith
68

Gunakan DATEDIFFfungsi dengan bagian data day.

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

Perhatikan bahwa jika Anda ingin menguji date1<= date2maka Anda perlu mengujinya DATEDIFF(day, date1, date2) >= 0, atau sebagai alternatif, Anda dapat mengujinya DATEDIFF(day, date2, date1) <= 0.

LukeH
sumber
Ini berfungsi, tetapi bisakah Anda menjelaskan mengapa? Bukankah itu hanya membandingkan hari?
grady
1
@grady: Tidak, ini menghitung jumlah batas hari antara date1dan date2; yaitu, jumlah tengah malam yang akan Anda lalui untuk pergi date1kedate2
LukeH
5
+1 Solusi paling elegan di sini. Saya akan mempertimbangkan ABS atau <> 0 meskipun jika diperlukan untuk memungkinkan tanggal2 sebelum tanggal1
gbn
3

Solusi satu baris yang sederhana adalah

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

Anda dapat mencoba berbagai opsi dengan ini selain "dd"

Sarathi B
sumber
0

Coba ini:

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
Kumar Akhil
sumber
0

Saya selalu menggunakan DateDiff (hari, tanggal1, tanggal2) untuk membandingkan dua tanggal.

Lihat contoh berikut. Cukup salin itu dan jalankan di server Ms sql. Selain itu, coba ubah tanggal 31 Desember menjadi 30 Desember dan periksa hasilnya

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
Jignesh Darji
sumber