2013-06-22 2 views
1

У меня есть таблица ORDERS, есть поле DATE_ADD, формат даты 2010-02-28 20:48:09. Мне нужно выяснить даты, когда не было заказа. Я пробовалSQL: найти даты без записи

SELECT * FROM `orders` HAVING COUNT(date_add) < 1 

, но он возвращает 0 результатов, хотя должно быть какое-то. Где я ошибаюсь здесь в этом запросе?

+0

'HAVING' является партнером' GROUP BY'. Попробуйте использовать их вместе – Raptor

+0

Сколько полей у вас? .. Я имею в виду столбцы ?? – Ahmed

ответ

1

Попробуйте это:

SELECT DATE(date_add), COUNT(date_add) AS cnt FROM `orders` GROUP BY DATE(date_add) HAVING COUNT(date_add) < 1 
0

Вы не можете запросить orders таблицу для данных, которые она не содержат. Или, если это так, вам нужна таблица всех доступных дат. Если у вас есть таблицы календаря, то вы делаете такой запрос, как:

select c.* 
from calendar c left outer join 
    (select distinct cast(date_add as date) as date_add 
     from orders 
    ) o 
    on c.date = o.date_add 
where o.date_add is null 

Примечание: Вам необходимо конвертировать date_add на дату (удаление временной части). Это зависит от базы данных. Вышеупомянутый синтаксис SQL Server. Это также может быть что-то вроде date(date_add) (MySQL) или trunc(date_add) (Oracle) или что-то еще.

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

select driver.dte 
from (select dte 
     from (select distinct cast(date_added + n.n as date) as dte 
      from orders 
      ) o cross join 
      (select 0 as n union all select 1 as n union all select 2 as n 
      ) 
    ) driver left outer join 
    (select distinct cast(date_add as date) as date_add 
     from orders 
    ) o 
    on driver.dte = o.date_add 
where o.date_add is null