mysql怎么求离指定年月最近的日期?

比如我数据库里有2018年1,3,5月(2018-01,2018-03,2018-05)和2019年2,6,10月(2019-02,2019-06,2019-10)的数据。我选择2019年9月,就出2019年6月的那一条数据,如果我选择2019年1月,那么不显示数据。也就是说数据必须是当年的,离选择的这个日期最近的。这个sql语句怎么写。日期和控件都不是date类型,前半部分大概是


微信截图_20191121133848.png


12083492 发布于 2019-11-21 13:40
1min目标场景问卷 立即参与
回答问题
悬赏:4 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共5回答
最佳回答
0
shirokoLv6资深互助
发布于2019-11-21 13:55

不知道你数据库结构怎么样,只能自己写一个你参考下。。。

image.pngimage.png

select yearmonth from 年月 A
WHERE SUBSTR(A.yearmonth,1,4)=SUBSTR("2018-08",1,4) 
ORDER BY ABS(SUBSTR(A.yearmonth,6,2)-SUBSTR("2018-08",6,2))
LIMIT 1


  • 12083492 12083492(提问者) 这个limit 1我试过,但是表结构可能不太对,我是需要group by的,就是a在2019-02有一条数据,2019-05有一条数据,b在2019-04有一条数据,查询条件是2019-05,那么展示的应该是a(2019-05)和b(2019-04)两条数据而不是只有a
    2019-11-21 14:14 
  • shiroko shiroko 回复 12083492(提问者) 那你就查两次union all
    2019-11-21 14:22 
  • 12083492 12083492(提问者) 回复 shiroko 我要是有100w个客户呢?
    2019-11-21 14:45 
最佳回答
0
No1-王子阳Lv5中级互助
发布于2019-11-21 14:23(编辑于 2019-11-21 14:44)

你这个好写啊,就是你思路的问题,你这样思考,你库里有:2019-02,2019-06,2019-10,这三个日期,当你选择的2019-09的时候就要查询2019-06的数据,所以你的日期字段就要是小于等于你的查询日期的最大的日期且年份是查询日期的年份,你这样不就筛选出来你的2019-06月份的数据了么,这个筛选出来的日期就可以作为你查询基础数据的日期。

image.png

SELECT * FROM (

SELECT '2019-02' AS RQ

UNION

SELECT '2019-06'AS RQ

UNION

SELECT '2019-10'AS RQ

) TABLE_ONE

WHERE TABLE_ONE.RQ = (

SELECT MAX(DATE_YEAR.RQ) AS RQ FROM (

SELECT '2019-02' AS RQ

UNION

SELECT '2019-06'AS RQ

UNION

SELECT '2019-10'AS RQ

) DATE_YEAR

WHERE LEFT(DATE_YEAR.RQ,4)='2019' AND DATE_YEAR.RQ<='2019-09'

)

或者这样

image.png

SELECT * FROM (

SELECT '2019-02' AS RQ

UNION

SELECT '2019-06'AS RQ

UNION

SELECT '2019-10'AS RQ

) DATE_YEAR

WHERE LEFT(DATE_YEAR.RQ,4)='2019' AND DATE_YEAR.RQ<='2019-09'

ORDER BY DATE_YEAR.RQ DESC

LIMIT 1

  • 12083492 12083492(提问者) 这种不通用啊,我要是5年的数据呢?我也不知道有没有这些年月啊,而且连表这种也是有生产要求的不能超过两个
    2019-11-21 14:47 
  • No1-王子阳 No1-王子阳 回复 12083492(提问者) 兄弟,我给你的只是这个思路,不是让你拿过去就用的,只是告诉你用这种形式可以做到你想要的效果和得到你想要的结果,拿到数据字段进行去重保证数据的唯一性,然后我给你的思路选出你数据中的日期,再用这个日期去筛选数据。
    2019-11-21 14:52 
最佳回答
0
hippomenes157Lv3见习互助
发布于2019-11-22 09:53

按年分组以日期排序计数,等于1时不取值,大于1时取计数减1所在行的值

最佳回答
0
maoningLv5初级互助
发布于2019-11-22 15:46

order by 一下,然后外面套一个子查询,查rownum等于1的

最佳回答
0
豆豆小可爱Lv5中级互助
发布于2019-11-22 16:34
SELECT *
FROM (SELECT 字段,MAX(CAAOUNTING_TIME) AS CAAOUNTING_TIME
WHERE 1=1
${IF(LEN(截止日期)=0,"","AND REPLACE(CAAOUNTING_TIME,'-','')<=REPLACE('"+截止日期+"','-','')")}
GROUP BY 字段) A
WHERE 1=1
${IF(LEN(截止日期)=0,"","AND REPLACE(CAAOUNTING_TIME,'-','')>=COUNT_WS('',LEFT('"+截止日期+"',4),'01')")}


大概这么写,试试看呢

  • 6关注人数
  • 798浏览人数
  • 最后回答于:2019-11-22 16:34
    请选择关闭问题的原因
    确定 取消
    返回顶部