TSQL DateTime Сравнение - PullRequest
       4

TSQL DateTime Сравнение

3 голосов
/ 19 декабря 2011

То, что я пытаюсь сделать, - это получить результат из 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строка не отображается, но если я сделаю эту дату на день выше, она отобразится.Я делаю что-то не так?Любой совет подойдет, спасибо.

Ответы [ 5 ]

5 голосов
/ 19 декабря 2011

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
3 голосов
/ 19 декабря 2011

Если вы хотите только сравнение ДАТЫ, без времени используйте

cast(CONVERT(varchar, StartDate, 112) as datetime)
1 голос
/ 06 апреля 2013

Если вы используете SQL 2008 или более позднюю версию и хотите сравнить только дату, а не время, вы также можете сделать следующее:

Cast(StartDate as Date)

(Это позволяет избежать преобразования в строку.)

1 голос
/ 19 декабря 2011

GETDATE () дает вам дату и время, если у вашего столбца есть только дата, тогда

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

может дать вам неожиданный результат

запомнить 19.12.2011 14:41> 19.12.2011 00: 00

1 голос
/ 19 декабря 2011

Я вполне уверен, что сравнение учитывает время и дату, и в этом случае, если даты совпадают, но текущее время больше, чем сравниваемое время, вы не получите эту строку как результат.

Итак, вам нужно просто извлечь часть даты и сравнить ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...