2014-09-24 6 views
1

В настоящее время у меня есть это предложение WHERE, которое включает следующие параметры.Использование случая в инструкции Where для дат

WHERE 
    Project ID=110 
    AND ((CAST(saa.Date AS DATE) >= '09/24/2014' AND CAST(saa.Date AS DATE) <= '09/24/2014') OR saa.Date IS NULL)) 

Хитрость здесь в том, что секция saa.Date is NULL собирается подтянуть ВСЕ Null значения во всех сроках (что является чрезмерным) Я только хочу, чтобы использовать следующий диапазон дат для Null значений

(
     (CAST(sa.StartDateTime AS DATE) >= '09/24/2014' AND CAST(sa.StartDateTime AS DATE) <= '09/24/2014') 
     OR 
     (CAST(sa.EndDateTime AS DATE) >= '09/24/2014' AND CAST(sa.EndDateTime AS DATE) <= '09/24/2014') 
) 

Так что я пытаюсь выяснить, как я могу создать CASE заявление, которое будет работать, что бы что-то вроде IF saa.Date является NULL Тогда [Использовать параметры Диапазон дат выше]

ответ

2

Я основываю свой ответ на @ AHiggins, но добавляя производительность в читаемость

- sergability

- избегать cast

- using between

WHERE 
    ProjectID=110 AND 
    (
     (
     saa.Date between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999' 
    ) OR 
     (
     saa.Date IS NULL AND 
     (
      sa.StartDateTime between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999' 
     ) OR 
     (
      sa.EndDateTime between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999' 
     ) 
    ) 
    )  

Убедитесь, что у вас есть ndexes на сегодняшний день Thos колонн

+0

Путь заставить меня выглядеть ленивым :) Я подумал об этом, я действительно сделал ... – AHiggins

+0

Несколько часов назад я получил поданные голоса за то, что не упомянул о том, что вдохновило мой ответ !!! :) – Horaciux

+0

Похоже, это приводит только к ненулевым значениям – StayPuft

0

Попробуйте

(
     (CAST(ISNULL(sa.StartDateTime, '09/24/2014') AS DATE) >= '09/24/2014' AND CAST(ISNULL(saa.StartDateTime, '09/24/2014') AS DATE) <= '09/24/2014') 
) 
1

Если я читаю это правильно, вы должны быть в состоянии сделать это с помощью булевой логики и несколько миллионов скобок:

EDIT: замеченных в комментариях на @ horaciux отвечает, что есть проблема, мы действительно нуждаемся в еще нескольких круглых скобках. Я одолжил заимствованный код и добавил дополнительные услуги ниже.

WHERE 
    ProjectID=110 AND 
    (
     (
     saa.Date between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999' 
    ) OR 
     (
     saa.Date IS NULL AND 
     (-- need to wrap the next two conditions in a single set of parentheses 
      (
      sa.StartDateTime between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999' 
     ) OR 
      (
      sa.EndDateTime between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999' 
     ) 
     ) 
    ) 
    ) 
+0

StayPuft, я думаю, что есть еще один набор отсутствующих круглых скобок: я заимствовал код @horaciux, улучшил и отредактировал мой ответ. – AHiggins

1

Вы знаете, что

>= '09/24/2014' 
AND <= '09/24/2014' 

такой же, как = '09/24/2014'

where ProjectID=110 
    AND CAST(saa.Date AS DATE) = '09/24/2014' 
    OR (
     saa.Date IS NULL 
     AND 
      ( 
       CAST(sa.StartDateTime AS DATE) = '09/24/2014' 
       OR 
       CAST(sa.EndDateTime AS DATE) = '09/24/2014' 
      )    
    ) 

Это является более эффективным, чем гипс:

DATEADD(dd, DATEDIFF(dd, 0, COL),0) 

Но ответ от Horaciux еще эффективнее

+0

спасибо за это. Он чувствует себя хорошо, когда он приходит от пользователей высокой репутации. – Horaciux