【问题标题】:SQL Query to check get nearest date with before and after check [duplicate]SQL查询以检查在检查之前和之后获取最近的日期[重复]
【发布时间】:2017-09-06 08:21:11
【问题描述】:

我有这样的桌子

ID             effective_date                 status
1              2014-12-01                     1
2              2016-11-18                     0 
3              2016-11-25                     1 
4              2017-04-21                     0
5              2017-05-20                     1

当状态 1 = 活动且 0 = 非活动时 我有一个日期搜索'2016-12-30'

我怎样才能得到一个与日期搜索最接近的活动状态的 date_effective 结果? 实际上结果是

ID             effective_date                 status
3              2016-11-25                     1

谢谢你的回答

【问题讨论】:

  • @SebastianBrosch 不是这样,这个帖子只检查最后一个周期,如何检查前后周期?
  • 链接答案的第一个解决方案(42 个赞成票)就是解决方案。你必须稍微编辑一下(提示LIMIT),但它应该可以工作。
  • 好的,感谢您提供的所有解决方案和信息。我现在明白了

标签: mysql sql


【解决方案1】:

按日期差排序并保留第一条记录:

select *
from mytable
where status = 1
order by abs(datediff(effective_date, date '2016-12-30'))
limit 1;

【讨论】:

    【解决方案2】:

    不必太复杂:

    SELECT * FROM
      table
    WHERE
      effective_date < str_to_date('20161230', '%Y%m%d') AND
      status = 1
    ORDER BY 
      effective_date DESC
    LIMIT 1
    

    编辑:我不确定 Giorgios Betaos 为何删除了他的帖子,因为根据提供的新信息,这似乎是正确的答案:

    SELECT * FROM
      table
    WHERE
      status = 1
    ORDER BY 
      ABS(effective_date - str_to_date('20161230', '%Y%m%d')) ASC
    LIMIT 1
    

    我们得到搜索中提供的日期与表中所有日期之间的绝对差,并按升序排列。差异最小的那个是最接近正在搜索的日期

    【讨论】:

    • 它只检查最后一个时期,那之后呢?我的意思是我也需要在月经前后检查一下
    • 进行了相应的编辑。不过应该归功于 Giorgios Betaos,他首先提出了这个解决方案。 Giorgios,也许可以取消删除您的帖子?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多