【问题标题】:Dynamic due date finder in a single query单个查询中的动态截止日期查找器
【发布时间】:2018-09-24 11:33:36
【问题描述】:
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 是(日、周、月、年)的枚举。要求是,客户可以给出任何日期。比方说 25-06-2026 到 13-07-2026 这样......我必须返回到期日期在该期限内的 ID。我希望我能明确我的问题。

我正在使用 mysql 5.7。我找到了一种使用递归 CTE 实现此目的的方法。(在 mysql 5.7 中不可用)。并且有一种方法可以通过使用内联子查询和联合来填充虚拟记录来实现这一点,但它是性能杀手,我们不能在每次客户端请求到来时填充虚拟记录。(如链接中给出的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 检查到期日期的动态方法

谢谢,坎南

【问题讨论】:

  • 我们可以只将日期视为 sql 日期 - 所以始终采用 y-m-d 格式。否则太混乱了?
  • 现在改。
  • 鉴于上面的数据集,想要的结果应该是什么样的?
  • 2030年附近远程数据集中没有记录
  • 是的。到期日期应由查询动态计算。这是我的要求

标签: mysql date datetime


【解决方案1】:

在 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;

【讨论】:

  • 嗯。谢谢你的回复草莓。不过我想这里会有办法做到。可能是一个很复杂的查询,但是应该有办法吧。?
猜你喜欢
  • 1970-01-01
  • 2019-10-14
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
相关资源
最近更新 更多