【问题标题】:Query that displays rows in a range of date with day, month and year在日期范围内显示行的查询,包括日、月和年
【发布时间】:2014-07-21 14:46:51
【问题描述】:

我的表日志中有以下列:

年、月、日、信息

我需要一个查询来选择用户确定的日期范围内的行。用户将选择最初的日、月和年以及最后的日、月和年。目前,我的查询是:

SELECT
    CONCAT(LPAD(`day`,2, 0),'/',LPAD(`month`,2, 0),'/',`year`) AS data,
    info
FROM
    Log
WHERE
    (year > :initial_year OR (year = :initial_year AND month >= :initial_moth AND day >= :initial_day))
    AND (year < :final_year OR (year = :final_year AND month <= :final_month AND day <= :final_day))
GROUP BY
    year, month, day
ORDER BY
    year DESC, month DESC, day DESC

但是这个查询不显示任何结果,即使它们在数据库中!出了什么问题,我该如何解决?

【问题讨论】:

  • 如果您使用 one date 字段,而不是将其分成三个单独的字段,这会容易得多……
  • 你说得对,但我不能修改数据库。

标签: mysql


【解决方案1】:

你的逻辑错了:

WHERE (
        year > :initial_year OR (
          year = :initial_year AND month >= :initial_moth AND day >= :initial_day
        )
      )

将排除您最初一年中日部分大于初始日部分的任何日期。例如yyyy-01-31 作为初始日期将排除 yyyy 的所有结果,其中日期部分不是 31。

最终日期也存在类似问题。

按照 cmets 中的建议,在您的数据库中使用一个 DATE 字段,并在您的应用程序代码中进行其他操作;这将节省很多戏剧性。

如果您无法更改数据库,请找到并责备设计它的人,直到他们更改为止。如果你不能这样做,那么:

WHERE (year>:initial_year OR (year=:initial_year AND (month>:initial_month OR (month=:initial_month AND day>=:initial_day))))

最后日期类似

【讨论】:

    【解决方案2】:

    怎么样:

    选择 concat(year,month,day) 作为日期,信息 从 日志 在哪里 thedate >= :startdate 和 thedate

    【讨论】:

    • 除了可怕的格式;您不能在 WHERE 子句中使用列别名。
    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多