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Просто чтобы было понятнее, что конкретно я делаю.

Другие вопросы по тегам