2015-10-28 2 views
0

Следующий sql работает нормально и возвращает 90 записей, как ожидалось, а также счетчик верен, но при добавлении фильтрации дат в sql он возвращает только 44 строки вместо 90, но общее количество верный.Оператор mysql с фильтрацией даты не работает

SQL без даты фильтрации:

sql without date filtering: 
SELECT 
t4.firstname, 
t1.category 
,COUNT(t3.catid) as days 
FROM category AS t1 
LEFT JOIN (SELECT 
      DISTINCT empid,t1.catid 
     FROM attendance AS t2 
     LEFT JOIN category AS t1 ON (t1.catid>0) 
     ) AS t2 
ON (t1.catid=t2.catid) 
LEFT JOIN attendance AS t3 ON (t2.empid=t3.empid AND t3.catid=t2.catid) 
left join employee t4 on t2.empId=t4.empid 
GROUP BY t2.empid,t2.catid 
ORDER BY t2.empid,t2.catid; 

с датой фильтрации:

SELECT 
t4.firstname, 
t1.category 
,COUNT(t3.catid) as days 
FROM category AS t1 
LEFT JOIN (SELECT 
      DISTINCT empid,t1.catid 
     FROM attendance AS t2 
     LEFT JOIN category AS t1 ON (t1.catid>0) 
     ) AS t2 
ON (t1.catid=t2.catid) 
LEFT JOIN attendance AS t3 ON (t2.empid=t3.empid AND t3.catid=t2.catid) 
left join employee t4 on t2.empId=t4.empid 
where 
date_format(dateIn, '%Y-%m-%d')>=str_to_date("1/01/2015", '%m/%d/%Y') 
and date_format(dateout, '%Y-%m-%d')<=str_to_date("12/31/2015", '%m/%d/%Y') 
GROUP BY t2.empid,t2.catid 
ORDER BY t2.empid,t2.catid; 
+0

Возможно, вы захотите включить некоторые данные образца. Вы сравниваете строку с датой: date_format (dateIn, '% Y-% m-% d')> = str_to_date ("1/01/2015", '% m /% d /% Y') '. Вы всегда должны сравнивать подобные типы. – JRD

ответ

0

При использовании date_format вы сравниваете строки, так что все становится перепутались. Я предлагаю вам использовать between вместо двух условий, таких как date_field BETWEEN '2015-01-01' AND '2015-12-31' и придерживаться формата YYYY-MM-DD.

SELECT 
t4.firstname, 
t1.category 
,COUNT(t3.catid) as days 
FROM category AS t1 
LEFT JOIN (SELECT 
      DISTINCT empid,t1.catid 
     FROM attendance AS t2 
     LEFT JOIN category AS t1 ON (t1.catid>0) 
     ) AS t2 
ON (t1.catid=t2.catid) 
LEFT JOIN attendance AS t3 ON (t2.empid=t3.empid AND t3.catid=t2.catid) 
left join employee t4 on t2.empId=t4.empid 
where 
dateIn between '2015-01-01' and '2015-12-31' 
GROUP BY t2.empid,t2.catid 
ORDER BY t2.empid,t2.catid; 
+0

Это дает мне тот же результат. –

+0

Какой тип поля dateIn? Можете ли вы поделиться результатом 'show create table TABLE_WITH_DATEIN_FIELD' – dotcomly

Смежные вопросы