【问题标题】:mysql : check date rangemysql:检查日期范围
【发布时间】:2012-12-24 03:58:26
【问题描述】:

我们有像

这样的表结构
id | startDay | startMonth | startYear | endDay | endMonth | endYear    
1  | 22       | 12         | 2012      | 25     | 1        | 2013  

现在我们有了另一个日期范围,例如 startDate,startMonth, startYear 即 25|12|2012 和 endDay,endMonth,endYear 即 10|1|2013

我希望查询从表中提供的日期范围存在的表中获取记录。在这种情况下表示首先记录。
如何为此编写查询?

【问题讨论】:

  • 为什么不使用date 类型作为开始和结束日期的日期字段?这就是这种类型的用途 - 处理 mysql 中的日期。
  • @Nemoden 实际上这个表结构已经设计好了,所以我们现在不能改变结构。

标签: mysql sql


【解决方案1】:

抛弃这种结构,使用原生日期字段:

id start_date  end_date
1  2012-12-22  2013-1-25

然后你可以使用原生 mysql 日期/时间函数和比较,例如

SELECT id WHERE yourdate BETWEEN start_date AND end_date

而不必使用丑陋的多级比较来正确比较这些碎片化的值:

SELECT id where YEAR(yourdate) < startYear OR (YEAR(yourdate) > startYear AND MONTH(yourdate) < startMOnth) etc... etc....etc..

【讨论】:

  • 我想检查范围不是 startDate 和 endDate 之间的日期。我想检查提供的 startDate 和 endDate 是否存在于表 startDate 和 endDate 中。如何检查这个
【解决方案2】:

首先,取@MarcB's advice。但如果您没有时间更改您的表,或者,您也可以使用以下查询。

SELECT *
FROM tableName
WHERE ('2012-12-25' BETWEEN DATE(CONCAT_WS('-', startYear, startMonth, startDay)) AND
                  DATE(CONCAT_WS('-', endYear, endMonth, endDay))) AND
      ('2013-01-10' BETWEEN DATE(CONCAT_WS('-', startYear, startMonth, startDay)) AND
                  DATE(CONCAT_WS('-', endYear, endMonth, endDay))) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2014-01-07
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多