我有一个数据库,其中月份和年份作为整数保存在不同的列中。该查询工作正常,但如果应用程序的用户选择了几年的时间跨度,则查询无法正常工作。
WORKS FINE: 01-2014 <--> 04-2014
DOESN'T WORK: 12-2013 <--> 02-2014
以下是该应用的原始工作查询:
SELECT tbl_report.YEAR, tbl_report.MONTH, tbl_question.ID, tbl_question.QUESTION , tbl_answer.ANSWER, tbl_question.TYPEID
FROM ....
WHERE tbl_report.CITYID = 'london'
AND tbl_report.YEAR >= 2013 AND tbl_report.YEAR <= 2013
AND tbl_report.MONTH >= 8 AND tbl_report.MONTH <= 9
如何解决构建查询以便将正确的结果反馈给用户 ?
答案 0 :(得分:4)
您需要与开始和停止年份以及其他月份相同年份的单独条件。
例如,如果您想要2013-10及之前的记录,您需要2013年的10,11和12个月,但需要接下来几年的所有月份。
获取2012-05至2014-02记录的示例:
where
tbl_report.CITYID = 'london' and
((tbl_report.YEAR = 2012 and tbl_report.MONTH >= 5) or tbl_report.YEAR > 2012) and
(tbl_report.YEAR < 2014 or (tbl_report.YEAR = 2014 and tbl_report.MONTH <= 2))
答案 1 :(得分:2)
这对你有多大意义?给我一个小于或等于2且大于或等于12的数字。
tbl_report.MONTH >= 12 AND tbl_report.MONTH <= 2
永远不会是真的!
至于解决方案:
在WHERE
子句中尝试此操作:
WHERE tbl_report.CITYID = 'london' AND
(
((tbl_report.YEAR = 2013 AND tbl_report.MONTH >= 12)
OR tbl_report.YEAR > 2013)
AND
((tbl_report.YEAR = 2014 AND tbl_report.MONTH <= 2)
OR tbl_report.YEAR < 2014)
)
*已更新以支持多年跨度。未在原始问题中指定,但它是更强大的查询。
答案 2 :(得分:2)
要解决这个问题,你可以这样做:
对于
的情况 DOESN'T WORK: 12-2013 <--> 02-2014
查询将是
SELECT tbl_report.YEAR, tbl_report.MONTH, tbl_question.ID, tbl_question.QUESTION , tbl_answer.ANSWER, tbl_question.TYPEID
FROM ....
WHERE tbl_report.CITYID = 'london'
AND
( tbl_report.YEAR > 2013 AND tbl_report.YEAR < 2014
OR tbl_report.MONTH >= 8 AND tbl_report.YEAR = 2013
OR tbl_report.MONTH <= 9 AND tbl_report.YEAR = 2014)
但是这对我来说看起来很糟糕,当sql和大多数数据库为你提供日期时间数据集时,你可以查询类似的东西:
where tabl_report.date between start_date and end_date;
答案 3 :(得分:0)
试试这个:
tbl_report.YEAR = 2013 AND tbl_report.MONTH = 12
OR tbl_report.YEAR = 2014 AND tbl_report.MONTH BETWEEN 1 AND 2
答案 4 :(得分:0)
您可以尝试这样做:
...
AND (tbl_report.YEAR, tbl_report.MONTH) >= (2013, 12)
AND (tbl_report.YEAR, tbl_report.MONTH) <= (2014, 2)
此语法为valid in MySQL,但它可能不会产生非常有效的查询计划。但是,如果它在您的环境中对您有效,那么您最终将获得针对您的特定问题的最清晰,最直观的查询。