MS SQL so sánh ngày?


86

Tôi có 2 ngày (lịch hẹn):

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

Nó cùng một ngày, chỉ khác thời gian. So sánh date1 và date2 bằng cách sử dụng <= không hoạt động vì date1 time. Vì vậy date1 <= date2 là sai, nhưng phải đúng. Tôi có thể so sánh chúng bằng cách chỉ nhìn vào năm, tháng và ngày để chúng giống nhau không? SQL Server 2008 của nó.

Cảm ơn :)


Phiên bản SQL Server nào? Bạn đang thực hiện phép so sánh này trong bối cảnh nào (nếu bạn đang so sánh với các cột, bạn cần chú ý để giữ cho mọi thứ dễ phân biệt)?
Martin Smith

Tôi đang làm điều này trong một "trường hợp được chọn". Nếu ngày là <= thì hãy làm điều này, nếu không, hãy làm điều đó. Nó SQL Server 2008
Grady

Để so sánh không thành công, có vẻ như ngày của bạn được lưu trữ dưới dạng chuỗi. Nếu chúng được lưu trữ dưới dạng datetime, tôi đoán là so sánh
pascal

date1 <= date2 = true? Làm thế nào là 3PM nhỏ hơn 12AM?
4 Rời khỏi Bìa

Câu trả lời:


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

Nên làm những gì bạn cần.

Trường hợp thử nghiệm

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 

Lợi nhuận

COMPARISON_WITH_CAST   |  COMPARISON_WITHOUT_CAST
Y                         N

1
Lưu ý rằng DATEloại không có sẵn trước SQL Server 2008.
LukeH

@Luke - Đúng. Do đó, truy vấn của tôi về phiên bản OP đang bật.
Martin Smith

@grady - Đúng là như vậy! Hãy xem trường hợp thử nghiệm này thực hiện chính xác những gì bạn muốn!
Martin Smith

68

Sử dụng DATEDIFFhàm với ngày tháng là day.

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

Lưu ý rằng nếu bạn muốn kiểm tra cái đó date1<= date2thì bạn cần phải kiểm tra cái đó DATEDIFF(day, date1, date2) >= 0, hoặc cách khác, bạn có thể kiểm tra DATEDIFF(day, date2, date1) <= 0.


Điều này hoạt động, nhưng bạn có thể giải thích tại sao không? Đó không phải là chỉ so sánh ngày?
grady

1
@grady: Không nó đếm số ranh giới trong ngày giữa date1date2; tức là số đêm bạn phải trải qua để date1đếndate2
LukeH

5
+1 Giải pháp thanh lịch nhất ở đây. Tôi muốn xem xét ABS hoặc <> 0 mặc dù nếu cần thiết để cho phép date2 trước date1
GBN

3

Giải pháp một dòng đơn giản là

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

Bạn có thể thử nhiều tùy chọn khác với tùy chọn này ngoài "dd"


0

Thử đi:

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

Tôi luôn sử dụng DateDiff (day, date1, date2) để so sánh hai ngày.

Kiểm tra ví dụ sau. Chỉ cần sao chép nó và chạy trong máy chủ sql Ms. Ngoài ra, hãy thử với ngày thay đổi từ 31 tháng 12 đến 30 tháng 12 và kiểm tra kết quả

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.