Проверка только части даты, поля DateTime - PullRequest
0 голосов
/ 10 октября 2011

У меня есть запрос вроде:

SELECT ..
        FROM ...
        WHERE ...
        AND ISNULL(ICA.actual_appearance_date, ICA.scheduled_appearance_date)  
            BETWEEN LO.order_start_date 
                AND ISNULL(LO.actual_expiry_date, LO.expected_expiry_date)

Есть ли удобный способ проверить, что фактическая_передача_даты находится между датой начала и окончания, но не включает время?

Дата появления - 03 октября 2011 года, 14:00 ... и даты, которые мы проверяем, - 3 октября 2011 года, 15:00 и 07 октября 2011 года: 10:00.

В данный момент это не даст результата из-за временных факторов.Мне нужно сделать только промежуточную часть даты ... Итак, между 03 октября 2011 года @ 00:00 и действительно 08 октября 2011 года @ 0:00.

Есть ли хороший способ сделать это?

Редактировать:

Мы разрабатываем для машины 2008 года, но мы разрабатываем машины на 2005 год.Длинная история, но я не могу использовать красивое и аккуратное исправление DATE.

Я пробую метод DATEADD, но нахожу проблему.

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

DECLARE  @Table TABLE
(
    StartDate DATETIME,
    EndDate DATETIME
)

INSERT INTO @Table VALUES ('02-Jan-2011 13:00:00', '07-Jan-2011 15:30:00')

SELECT * FROM @Table
DECLARE @Date DATETIME
SET @Date = '07-Jan-2011 16:00:00'

SELECT
    CASE WHEN 
        @Date BETWEEN DATEADD(dd,DATEDIFF(dd,0,StartDate),0) AND DATEADD(dd, DATEDIFF(dd,0,EndDate),0)-- must cover the appearance date or still open
    THEN 1
    ELSE 0
    END AS Result
FROM @Table

Должен ли я добавить +1 к ДАННЫМ МЕЖДУ, чтобы включить последнюю дату?«Между» не похоже на последнюю дату ..

Ответы [ 2 ]

2 голосов
/ 10 октября 2011

У вас есть SQL Server 2008, поэтому просто приведите к дате

SELECT .. 
FROM ... 
WHERE ... AND 
     CAST(ISNULL(ICA.actual_appearance_date, ICA.scheduled_appearance_date) AS date)
        BETWEEN
           CAST(LO.order_start_date AS date)
        AND 
           CAST(ISNULL(LO.actual_expiry_date, LO.expected_expiry_date) AS date)

Для SQL Server 2005 и более ранних версий используйте прием DATEDIFF / DATEADD: Лучший подход для удаления части времени datetime в SQL Server

Не использовать преобразования varchar или float

Edit :, для SQL Server 2005

Необходимо применить DATEADD / DATEDIFF к all значения

...
SELECT
    CASE WHEN 
         DATEADD(dd,DATEDIFF(dd,0,@Date),0)
              BETWEEN DATEADD(dd,DATEDIFF(dd,0,StartDate),0)
              AND DATEADD(dd, DATEDIFF(dd,0,EndDate),0)
    THEN 1
    ELSE 0
    END AS Result
FROM @Table

или

WHERE ... AND 
     DATEADD(dd,DATEDIFF(dd,0,ISNULL(ICA.actual_appearance_date, ICA.scheduled_appearance_date),0)
        BETWEEN
           DATEADD(dd,DATEDIFF(dd,0,LO.order_start_date),0)
        AND 
           DATEADD(dd,DATEDIFF(dd,0,ISNULL(LO.actual_expiry_date, LO.expected_expiry_date),0)
0 голосов
/ 10 октября 2011

Вы можете использовать процесс преобразования, а затем сравнить:

Convert(Datetime,Convert(Varchar,OrderDate,106),110) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...