id start_date interval period
1 2018-01-22 2 month
2 2018-02-25 3 week
3 2017-11-24 3 day
4 2017-07-22 1 year
5 2018-02-25 2 week
以上是我的表格数据样本。 start_dates 将根据间隔和周期过期(即 id-1 将在 start_date 后 2 个月后到期,id-2 将在 3 周后到期,反之亦然)。 period 是(日、周、月、年)的枚举。要求是,客户可以给出任何日期期间。比如说2026年6月25日到2026年7月13日。我必须返回截止日期在此期间的ID。我希望我的问题说清楚了。
我使用的是mysql 5.7。我找到了一种使用递归 CTE 来实现此目的的方法。(在 mysql 5.7 中不可用)。有一种方法可以通过使用内联子查询和联合来填充虚拟记录来实现这一点,但它是性能 killer ,我们不能在每次客户端请求到来时填充虚拟记录。(如链接Generating a series of dates中给出的那样) )我已经达到了获得单个日期结果的地步,这非常容易。以下是我的查询。
SELECT b.*
FROM (SELECT a.*,
CASE
WHEN period = 'week' THEN MOD(Datediff('2018-07-22', start_date), 7 * intervals)
WHEN period = 'month'
AND Day('2018-07-22') = Day(start_date)
AND MOD(Period_diff(201807, Extract(YEAR_MONTH FROM start_date)), intervals) = 0 THEN 0
WHEN period = 'year'
AND Day('2018-07-22') = Day(start_date)
AND MOD(Period_diff(201807, Extract(
YEAR_MONTH FROM start_date)) / 12,
intervals) = 0 THEN 0
WHEN period = 'day' THEN MOD(Datediff('2018-07-22', start_date) , intervals)
end filters
FROM kml_subs a)b
WHERE b.filters = 0;
但我需要在一段日期而不是单个日期执行此操作。任何建议或解决方案将不胜感激。
My desired result shoud be like..
if i give two dates.say 2030-05-21 & 2030-05-27. due dates falls under those 6 dates between(2030-05-21 & 2030-05-27) will be shown in the result.
id
1
4
我的问题与 Using DATE_ADD with a Column Name as the Interval Value 不同。我期待一种基于 start_date 的动态方式来检查截止日期
谢谢,坎南
最佳答案
在 MySQL 中,似乎按照这些思路进行查询就足够了。 (几乎)其他所有事情都可以而且应该在应用程序级代码中处理......
SELECT *
, CASE my_period WHEN 'day' THEN start_date + INTERVAL my_interval DAY
WHEN 'week' THEN start_date + INTERVAL my_interval WEEK
WHEN 'month' THEN start_date + INTERVAL my_interval MONTH
WHEN 'year' THEN start_date + INTERVAL my_interval YEAR
END due_date
FROM my_table;
关于mysql - 单个查询中的动态到期日查找器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52478455/