MySQL整数作为where子句中的Date

时间:2014-04-15 20:15:06

标签: mysql sql function

我有一个数据库,其中月份和年份作为整数保存在不同的列中。该查询工作正常,但如果应用程序的用户选择了几年的时间跨度,则查询无法正常工作。

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

如何解决构建查询以便将正确的结果反馈给用户

5 个答案:

答案 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,但它可能不会产生非常有效的查询计划。但是,如果它在您的环境中对您有效,那么您最终将获得针对您的特定问题的最清晰,最直观的查询。