2011-12-19 244 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) 

(这避免了转换为字符串。)