MS SQL เปรียบเทียบวันที่?


88

ฉันมี 2 วันที่ (วันที่):

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

มันเป็นวันเดียวกันเวลาต่างกัน การเปรียบเทียบ date1 และ date2 โดยใช้ <= ไม่ได้ผลเนื่องจากเวลา date1 ดังนั้น date1 <= date2 จึงผิด แต่ควรเป็นจริง ฉันสามารถเปรียบเทียบโดยดูที่ปีเดือนและวันเพื่อให้เหมือนกันได้หรือไม่? SQL Server 2008

ขอบคุณ :)


SQL Server เวอร์ชันใด คุณกำลังทำการเปรียบเทียบนี้ในบริบทใด (หากคุณกำลังเปรียบเทียบกับคอลัมน์ที่คุณต้องดูแลเพื่อให้สิ่งต่างๆไม่สามารถเข้าใจได้)
Martin Smith

ฉันกำลังทำสิ่งนี้ใน "กรณีเลือก" หากวันที่ <= ให้ทำเช่นนี้ถ้าไม่ทำเช่นนั้น SQL Server 2008
Grady

เพื่อให้การเปรียบเทียบล้มเหลวดูเหมือนว่าวันที่ของคุณจะถูกจัดเก็บเป็นสตริง ถ้าเก็บเป็นวันที่และเวลาฉันเดาว่าการเปรียบเทียบ
pascal

date1 <= date2 = จริง? 15.00 น. น้อยกว่า 12.00 น. อย่างไร?
4 ลาปก

คำตอบ:


90
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 อยู่
Martin Smith

@grady - ใช่แล้ว! ดูกรณีทดสอบนี้ทำในสิ่งที่คุณบอกว่าคุณต้องการ
Martin Smith

68

ใช้DATEDIFFฟังก์ชันที่มีส่วนdayวันที่

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

โปรดทราบว่าหากคุณต้องการทดสอบdate1<= date2คุณต้องทดสอบDATEDIFF(day, date1, date2) >= 0หรือจะทดสอบDATEDIFF(day, date2, date1) <= 0ก็ได้


วิธีนี้ได้ผล แต่คุณช่วยอธิบายได้ไหมว่าทำไม? ไม่ใช่แค่เปรียบเทียบวัน?
grady

1
@grady: Nope มันนับจำนวนวันเขตแดนระหว่างdate1และdate2; นั่นคือจำนวนdate1date2
มิดไนต์ที่

5
+1 ทางออกที่หรูหราที่สุดที่นี่ ฉันจะพิจารณา ABS หรือ <> 0 แต่ถ้าจำเป็นต้องอนุญาตสำหรับ date2 ก่อน date1
gbn

3

วิธีแก้ปัญหาง่ายๆเพียงบรรทัดเดียวคือ

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 (วัน, วันที่ 1, วันที่ 2) เพื่อเปรียบเทียบวันที่สองวัน

ชำระเงินตัวอย่างต่อไปนี้ เพียงแค่คัดลอกและเรียกใช้ในเซิร์ฟเวอร์ Ms sql ลองเปลี่ยนวันที่ 31 ธ.ค. ถึง 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.