计算日期范围

时间:2017-07-18 05:30:48

标签: mysql

我正在开发mysql select query,其最终目标是根据预定义日期范围内的子集计数获取整数。

场景有一些限制,我似乎无法以干净的方式导航。为了简明起见,我们假设我正在处理成员组织的数据。我的情况基础包括:

  1. 用户加入日期(后来引用为' join_date'并以格式' yyyy-mm-dd'存储在我的数据库中的日期字段中)
  2. 我的日历基于两个时期:秋季学期和春季学期(名称可能有点误导)。在日历年内,春季学期定义为2月16日至9月15日,而秋季学期定义为9月16日,即2月15日(明年)。
  3. 当用户加入时,为了计算此查询,下一个学期被视为第一个学期。 (即1月5日(秋季)加入意味着用户第一学期将是当年春季,而9月20日(秋季)加入意味着用户第一学期将是明年春季。
  4. 回到我的查询需求。相对于当前日期的下学期,我需要计算在第八学期(包括第八学期)之前剩余的秋季+春季学期的数量。即,如果我在2016年4月1日加入,我的第一个学期将是2016年秋季,我的第八个学期将是2020年春季。截至当前日期(今天= 2017-07-17),我需要得到6个返回,这将代表2017年秋季,2018年春季,2018年秋季,2019年春季,2019年秋季和2020年春季。

    其他一些例子:

    • 加入2016-01-01,第一学期是2016年春季,第八学期是2019年秋季,剩下的回归数是5。
    • 加入2016-10-01,第一学期是2017年春季,第八学期是2020年秋季,剩下的回归数是7。

    我一直在使用CASE语句来帮助解决这个问题,但我是新手并且不知道这是否是最佳方法。 强烈首选是动态执行此操作,而不必使用临时表或类似工具,在这种情况下,它很容易。我目前的CASE陈述似乎有效:

    CASE 
    WHEN DATE_FORMAT( join_date, '%m/%d' ) BETWEEN '01/01' AND '02/14' THEN CONCAT( 'Spring ', YEAR ( join_date) ) 
    WHEN DATE_FORMAT( join_date, '%m/%d' ) BETWEEN '02/15' AND '09/14' THEN CONCAT( 'Fall ', YEAR ( join_date) ) 
    WHEN DATE_FORMAT( join_date, '%m/%d' ) BETWEEN '09/15' AND '12/31' THEN CONCAT( 'Spring ', YEAR ( join_date) + 1 ) 
    END AS '1st semester'
    
    CASE
    WHEN DATE_FORMAT( join_date, '%m/%d' ) BETWEEN '01/01' AND '02/14' THEN CONCAT( 'Fall ', YEAR ( join_date) + 3 ) 
    WHEN DATE_FORMAT( join_date, '%m/%d' ) BETWEEN '02/15' AND '09/14' THEN CONCAT( 'Spring ', YEAR ( join_date) + 4 ) 
    WHEN DATE_FORMAT( join_date, '%m/%d' ) BETWEEN '09/15' AND '12/31' THEN CONCAT( 'Fall ', YEAR ( join_date ) + 4 ) 
    END AS '8th semester'
    
    CASE
    WHEN DATE_FORMAT( CURDATE( ), '%m/%d' ) BETWEEN '01/01' AND '02/14' THEN CONCAT( 'Fall ', YEAR ( CURDATE( ) ) - 1 )
    WHEN DATE_FORMAT( CURDATE( ), '%m/%d' ) BETWEEN '02/15' AND '09/14' THEN CONCAT( 'Spring ', YEAR ( CURDATE( ) ) )
    WHEN DATE_FORMAT( CURDATE( ), '%m/%d' ) BETWEEN '09/15' AND '12/31' THEN CONCAT( 'Fall ', YEAR ( CURDATE( ) ) )
    END AS 'current semester'
    
    CASE
    WHEN DATE_FORMAT( CURDATE( ), '%m/%d' ) BETWEEN '01/01' AND '02/14' THEN CONCAT( 'Spring ', YEAR ( CURDATE( ) ) )
    WHEN DATE_FORMAT( CURDATE( ), '%m/%d' ) BETWEEN '02/15' AND '09/14' THEN CONCAT( 'Fall ', YEAR ( CURDATE( ) ) )
    WHEN DATE_FORMAT( CURDATE( ), '%m/%d' ) BETWEEN '09/15' AND '12/31' THEN CONCAT( 'Spring ', YEAR ( CURDATE( ) ) + 1 )
    END AS 'next semester'
    

    最终,我需要找到剩余学期的计数'

    非常感谢任何帮助或指导。您可以在http://sqlfiddle.com/#!9/01319找到一些用户示例的示例。

    这些示例的预期结果是用户3060457获得2,用户3060458获得5,用户3060459获得6,用户3060460获得7。

0 个答案:

没有答案