ColdFusion cfdump / cfoutput не соответствует результатам анализатора запросов
Я создал запрос, который отображает другие данные при выполнении в Microsoft SQL Server Management Studio Express, чем при выводе в браузере с использованием cfdump
или же cfoutput
,
Вот запрос:
select count(stat_id) as val, month(status_date) as mnth, year(status_date) as yr
from task_status ts
join appraisal.dbo.employee e on e.userID = ts.user_ID
where e.comp = 1
and e.dept = 2
and e.archive != 1
and ts.status_date between '2016-10-01 00:00:00' AND '2017-10-01 00:00:00'
group by month(status_date), year(status_date)
order by year(status_date), month(status_date)
Ожидаемые результаты и результаты, наблюдаемые в Management Studio:
YR MNTH YR
1 10 2016
1 11 2016
9 2 2017
4 3 2017
3 4 2017
18 5 2017
6 6 2017
1 7 2017
Тем не менее, результаты, видимые из браузера:
YR MNTH VAL
2016 1 7
2016 2 13
2016 3 5
2016 4 5
2016 5 1
2016 6 4
2016 7 2
2016 10 1
2016 11 1
Любые предложения относительно того, что может быть причиной этого, будут приветствоваться, так как я понятия не имею, почему есть разница.
1 ответ
РЕДАКТИРОВАТЬ:
Попробуйте изменить даты в вашем запросе на
select count(stat_id) as val, month(status_date) as mnth, year(status_date) as yr
from task_status ts
INNER JOIN appraisal.dbo.employee e on e.userID = ts.user_ID
AND e.comp = 1
AND e.dept = 2
AND e.archive != 1
WHERE ts.status_date between '20161001' AND '20171001'
group by year(status_date), month(status_date)
order by year(status_date), month(status_date)
См. ISO 8601. Вы также можете изменить даты на '2016-10-01T00:00:00' AND '2017-10-01T00:00:00'
,
Я полагаю, что ваша дата может интерпретироваться как строка, которая читается как YYYY-DD-MM и дает неправильный диапазон при передаче в SQL через ColdFusion или JVM.
================================================== =======================
ОРИГИНАЛ:
Это больше личного комментария предпочтения:
Измени свой JOIN
синтаксис для перемещения условий из WHERE
и в JOIN
,
select count(stat_id) as val, month(status_date) as mnth, year(status_date) as yr
from task_status ts
INNER JOIN appraisal.dbo.employee e on e.userID = ts.user_ID
AND e.comp = 1
AND e.dept = 2
AND e.archive != 1
WHERE ts.status_date between '2016-10-01 00:00:00' AND '2017-10-01 00:00:00'
group by year(status_date), month(status_date)
order by year(status_date), month(status_date)
когда JOIN
Таблицы помогают представить наборы данных, с которыми вы работаете. Когда вы указываете условия в WHERE
, вы будете создавать большой JOIN
а затем отфильтровывать эти результаты с WHERE
пункт. Я думаю, что новые версии SQL более разумны с их оптимизатором, но я знаю, что 2005 год может возвращать разные результаты, когда условия находятся в LEFT OUTER JOIN
против WHERE
, INNER JOIN
не будет иметь значения, но OUTER
Можно.
Я также изменил порядок в вашем GROUP BY
, Это не должно изменить результаты, но оно более чистое и более согласуется с группировкой способов использования данных (группа по годам, а затем по месяцам тех лет).
И личное предпочтение: а не просто использование JOIN
Мне нравится добавлять INNER JOIN
Просто чтобы было понятнее, что конкретно я делаю.