2011-12-19 245 views
3

我想要做的是從SQL的日期是在一定範圍內,但其工作不正常,這裏是我的查詢得到的結果。TSQL日期時間比較

DECLARE @CurrDate DATETIME 
SET @CurrDate = GETDATE() 
SELECT dbo.ProductDetails.PartnerID 
     ,dbo.ProductDetails.ProductID 
     ,dbo.Products.ProductName 
     ,StartDate 
     ,EndDate 
FROM dbo.ProductDetails 
    INNER JOIN dbo.Products 
     ON dbo.ProductDetails.ProductID = dbo.Products.ProductID 
WHERE CONVERT(VARCHAR(10),StartDate,111) <= @CurrDate 
    AND CONVERT(VARCHAR(10),EndDate, 111) >= @CurrDate 

但當Enddate = @CurrDate行不顯示,但如果我作出這樣的日期僅僅一天更高它就會顯示出來。我做錯了什麼?任何建議都可以,謝謝。

回答

3

如果您只想要DATE比較,不需要時間使用

cast(CONVERT(varchar, StartDate, 112) as datetime) 
+0

但這並沒有考慮到'GetDate()'也提供了一個時間,對吧?你必須在那裏做同樣的轉換... – codeling 2011-12-19 13:52:24

+0

是的,我做了那裏的轉換,現在它正在工作。 謝謝! – johnnie 2011-12-19 13:56:40

+0

如果使用SQL 2008,可以這樣做:'Cast(StartDate as Date)' – 2013-04-05 22:32:12

1

我很確定比較考慮了時間以及日期,在這種情況下,如果日期相同但當前時間大於與您比較的時間,您將無法獲得該行結果是。

所以,你需要做的只是提取日期部分,並比較這些。

1

GETDATE()爲您提供了日期和時間 如果你列只有日期 然後

CONVERT(VARCHAR(10),StartDate,111) <= @CurrDate 

可以給你帶來意想不到的結果

記得 19.12.2011 14:41> 19.12.2011 00 :00

+0

好吧,所以我應該設置@CurrDate只有日期? 有道理。 – johnnie 2011-12-19 13:46:35

5

GetDate()返回日期和時間,而你的轉換爲varchar剝離時間部分(我懷疑這就是它實際上應該這樣做)。所以你需要爲@CurrDate做相同的轉換。

如果您想要僅考慮日期(忽略時間部分),則可以使用DATEDIFF而不是轉換爲varchar(請參閱here);例如:

DECLARE @CurrDate DATETIME 
SET @CurrDate = GETDATE() 
SELECT dbo.ProductDetails.PartnerID, dbo.ProductDetails.ProductID, 
     dbo.Products.ProductName , StartDate, EndDate 
    FROM dbo.ProductDetails INNER JOIN 
     dbo.Products ON dbo.ProductDetails.ProductID = dbo.Products.ProductID 
    -- where StartDate is on the same day or before CurrDate: 
    WHERE DATEDIFF(day, StartDate, @CurrDate) >= 0 AND 
    -- and where EndDate is on the same day or after CurrDate: 
      DATEDIFF(day, EndDate, @CurrDate) <= 0 
1

如果您使用的是SQL 2008或更高版本,並希望比較只有日期,沒有時間,你也可以這樣做:

Cast(StartDate as Date) 

(這避免了轉換爲字符串。)