【问题标题】:MySQL Select where column greater than or equal to closest past date from given dateMySQL 选择 where 列大于或等于距给定日期最近的过去日期
【发布时间】:2016-08-04 06:28:44
【问题描述】:

表格

Table:

Id             Date
1            01-10-15
2            01-01-16
3            01-03-16
4            01-06-16
5            01-08-16

给定两个日期 startdate 01-02-16 和 enddate 01-05-16。我需要从表中获取数据,以便它返回从 startdate 到最近的过去日期和从 enddate 到最近的未来日期之间的所有数据,包括这两个日期。所以结果会是这样的。

Result:

Id             Date
2            01-01-16
3            01-03-16
4            01-06-16

我在做什么

我现在正在做的是获取整个数据并从数组中删除小于最接近 fromdate 和大于最接近 enddate

的结果

我想要什么

我想要的是在查询本身中执行此操作,这样我就不必每次都从表中获取整个数据。

【问题讨论】:

  • 了解between
  • 并将日期存储在日期数据类型下
  • @Jens 需要分别包含与 fromdate 和 enddate 最接近的过去日期和最接近的未来日期。
  • 你如何定义最接近startDate & closest dateendDate & closest date 之间的阈值差异是多少?
  • @1000111 这里最接近的意思是最近的过去日期,例如:一月、二月、三月、四月。二月是最接近三月的过去日期。同样关于结束日期

标签: mysql date select


【解决方案1】:

如果你的专栏类型是date,使用union就可以了:

(select * from yourtable where `date` <= '2016-01-02' order by `date` desc limit 1)
-- This query will get record which is closest past date from startdate
union
(select * from yourtable where `date` => '2016-01-05' order by `date` asc limit 1)
-- This query will get record which is closest future date from enddate
union
(select * from yourtable where `date` between '2016-01-02' and '2016-01-05')

Demo Here

【讨论】:

  • 你好雷诺!此查询会返回开始日期和结束日期之间的日期吗?不是使用限制 1 将其限制为 1 行吗?你也可能会得到重复的日期。
  • 请简要说明此查询在最近日期获取查询时的工作原理。否则没关系。 +1 :)
  • @1000111 当然,为什么不呢。谢谢。 :-)
【解决方案2】:

想象你的日期是 YYYY-mm-dd

## get rows within the dates
SELECT * FROM tab WHERE ymd BETWEEN :start_date AND :end_date
## get one row closest to start date

UNION
SELECT * FROM tab WHERE ymd < :start_date ORDER BY ymd DESC LIMIT 1
## get one row closest to end date

UNION
SELECT * FROM tab WHERE ymd > :end_date   ORDER BY ymd      LIMIT 1

【讨论】:

  • 请简要说明此查询在最近日期获取查询时的工作原理。否则没关系。 +1 :)
【解决方案3】:

试试这个

Select *
From 
    dTable 
Where 
     [Date] 
Between 
       (Select 
              Max(t1.Date) 
        From 
            dTable t1 
        Where 
             t1.date <startdate) And    
       (Select 
              Min(t2.Date) 
        From 
             dTable t2 
        Where 
             t2.date >enddate)

【讨论】:

  • 我认为它会因为 >= 而省略最接近的日期。
  • 现在好了。 :) 更好地解释这个查询是如何工作的。 +1
【解决方案4】:

如果 Date 是 String,这里可以使用 STR_TO_DATE 和 DATEDIFF。

SELECT  id,  Date
FROM tab
where
STR_TO_DATE(Date, '%d-%m-%y') BETWEEN('2016-02-01')AND('2016-05-01')
or 
id = (SELECT id FROM tab
where STR_TO_DATE(Date, '%d-%m-%y') > '2016-05-01'
ORDER BY DATEDIFF(STR_TO_DATE(Date, '%d-%m-%y'), '2016-05-01') Limit 1)
or 
id = (SELECT id FROM tab
where STR_TO_DATE(Date, '%d-%m-%y') < '2016-02-01'
ORDER BY DATEDIFF('2016-02-01', STR_TO_DATE(Date, '%d-%m-%y')) Limit 1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多