Tsql 日期时间比较

Tsql 日期时间比较,tsql,Tsql,我要做的是从sql中获取一个结果,其中日期在某个范围内,但不能正常工作,下面是我的查询 DECLARE @CurrDate DATETIME SET @CurrDate = GETDATE() SELECT dbo.ProductDetails.PartnerID ,dbo.ProductDetails.ProductID ,dbo.Products.ProductName ,StartDate ,EndDate FROM dbo.ProductD

我要做的是从sql中获取一个结果,其中日期在某个范围内,但不能正常工作,下面是我的查询

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时,行不会显示,但是如果我将该日期再高一天,它就会显示出来。我做错什么了吗?任何建议都行,谢谢。

我确信比较时会考虑时间和日期,在这种情况下,如果日期相同,但当前时间大于所比较的时间,则不会得到该行


因此,您需要做的只是提取日期部分并比较它们。

GETDATE为您提供日期和时间 如果你的专栏只有日期 然后

会给你意想不到的结果

记得吗
2011年12月19日14:41>2011年12月19日00:00

如果只需要日期比较,而不需要时间,请使用

cast(CONVERT(varchar, StartDate, 112) as datetime)
GetDate返回日期和时间,而您对varchar的转换去掉了时间部分,我怀疑这就是它实际上应该做的。因此,您需要对@CurrDate进行相同的转换

如果你想简单地只考虑日期,忽略时间部分,你可以使用DATEDIFF而不是转换为VARCHAR看;例如:

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

如果您使用的是SQL 2008或更高版本,并且只想比较日期而不是时间,您还可以执行以下操作:

Cast(StartDate as Date)

这避免了必须转换为字符串。

Ok,那么我应该只将@CurrDate设置为Date?有道理,但这并没有考虑到GetDate也提供了一个时间,对吗?你也必须在那里做同样的转换…是的,我也在那里做了转换,现在它正在工作。谢谢如果使用SQL 2008,可以执行以下操作:CastStartDate作为日期
Cast(StartDate as Date)