ColdFusion cfdump / cfoutput 与查询分析器结果不匹配
ColdFusion cfdump / cfoutput doesn't match query analyser results
我创建了一个查询,它在 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
欢迎就可能导致此问题的原因提出任何建议,因为我不知道为什么会有差异。
编辑:
尝试将查询中的日期更改为
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,并且在通过 ColdFusion 或 JVM 传递给 SQL 时给出了错误的范围。
====================================== =================================
原文:
这更多是个人喜好评论:
更改 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 可以 return 在条件处于 LEFT OUTER JOIN
与 WHERE
时产生不同的结果。 INNER JOIN
不会有什么不同,但 OUTER
可以。
我也更改了您 GROUP BY
中的顺序。它不应该改变结果,但它更清晰,更符合数据可能使用方式的分组(按年份分组,然后按这些年份的月份分组)。
和个人偏好:我喜欢添加 INNER JOIN
而不是只使用 JOIN
,只是为了更清楚地说明我具体在做什么。
我创建了一个查询,它在 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
欢迎就可能导致此问题的原因提出任何建议,因为我不知道为什么会有差异。
编辑:
尝试将查询中的日期更改为
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,并且在通过 ColdFusion 或 JVM 传递给 SQL 时给出了错误的范围。
====================================== =================================
原文:
这更多是个人喜好评论:
更改 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 可以 return 在条件处于 LEFT OUTER JOIN
与 WHERE
时产生不同的结果。 INNER JOIN
不会有什么不同,但 OUTER
可以。
我也更改了您 GROUP BY
中的顺序。它不应该改变结果,但它更清晰,更符合数据可能使用方式的分组(按年份分组,然后按这些年份的月份分组)。
和个人偏好:我喜欢添加 INNER JOIN
而不是只使用 JOIN
,只是为了更清楚地说明我具体在做什么。