MS SQL tarihleri ​​karşılaştırıyor mu?


88

2 tarihim var (tarihlerim):

tarih1 = 2010-12-31 15: 13: 48.593
tarih2 = 2010-12-31 00: 00: 00.000

Aynı gün, sadece farklı zamanlarda. <= Kullanarak tarih1 ve tarih2'nin karşılaştırılması, tarih1 saati nedeniyle çalışmaz. Yani tarih1 <= tarih2 yanlış, ancak doğru olmalı. Onları sadece yıla, aya ve güne bakarak karşılaştırabilir miyim ki aynı olsunlar? SQL Server 2008.

Teşekkürler :)


SQL Server'ın hangi sürümü? Bu karşılaştırmayı hangi bağlamda yapıyorsunuz (eğer sütunlarla karşılaştırıyorsanız, her şeyi alay konusu olmaya özen göstermelisiniz)?
Martin Smith

Bunu bir "seçili durumda" yapıyorum. Tarihler <= ise bunu yapın, değilse bunu yapın. Onun SQL Server 2008
Grady

Karşılaştırmanın başarısız olması için tarihinizin dizeler olarak saklandığı görülüyor. Tarih saat olarak depolanmışlarsa, sanırım karşılaştırma
pascal

tarih1 <= tarih2 = doğru? 3 PM nasıl 12: 00'den azdır?
4 Kapak

Yanıtlar:


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

İhtiyacınız olanı yapmalısınız.

Test durumu

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 

İadeler

COMPARISON_WITH_CAST   |  COMPARISON_WITHOUT_CAST
Y                         N

1
DATE
Türün

@Luke - Evet. Dolayısıyla OP'nin hangi sürümde olduğu ile ilgili sorgum.
Martin Smith

@grady - Evet öyle! Test vakasına bakın, bu tam olarak istediğinizi yapar!
Martin Smith

68

DATEDIFFİşlevi bir veri bölümü ile kullanın day.

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

Bunu date1<= date2test etmek DATEDIFF(day, date1, date2) >= 0istiyorsanız, bunu test etmeniz veya alternatif olarak test etmeniz gerektiğini unutmayın DATEDIFF(day, date2, date1) <= 0.


Bu işe yarıyor, ancak nedenini açıklayabilir misiniz? Bu sadece günleri karşılaştırmak değil mi?
Grady

1
@grady: Hayır, ve arasındaki gün sınırlarının sayısını sayar ; olduğunu, gece yarılarına sayısı, almak yoluyla geçerdi içindate1date2date1date2
LukeH

5
+1 En şık çözüm burada. Tarih1'den önce tarih2'ye izin vermek gerekirse, ABS veya <> 0 olarak kabul ederim
gbn

3

Basit tek satırlık çözüm

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

Bununla "dd" dışında çeşitli seçenekleri deneyebilirsiniz.


0

Bunu dene:

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

İki tarihi karşılaştırmak için her zaman DateDiff (gün, tarih1, tarih2) kullanılır.

Aşağıdaki örneği kontrol edin. Bunu kopyalayın ve Ms sql sunucusunda çalıştırın. Ayrıca, 31 Aralık ile 30 Aralık arasında değişiklik tarihini deneyin ve sonucu kontrol edin

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.