【问题标题】:Finding Members between a Date Range在日期范围之间查找成员
【发布时间】:2016-10-24 10:55:32
【问题描述】:

我需要查找两个日期(7-01-14 和 6-30-15)之间的成员资格,这些日期在该时间范围内成为成员至少 4 个月或更长时间。有一个 START_DATE 和一个 END_DATE 列。任何意见,将不胜感激。谢谢。

【问题讨论】:

  • 你能给我们看看你所有的专栏吗?
  • 请展示您尝试过的内容,一些数据和输出样本将非常有用!
  • 这里有一个建议 - 阅读How to Ask。编辑您的问题以包括相关表格 ddl 和一些示例数据作为 ddl。此外,包括所需的结果。

标签: sql sql-server teradata


【解决方案1】:

你可以使用这个代码:

select * 
from YourTable 
where DateColumn between '2014/01/7' and '2006/05/30' and 
    start_date >= Dateadd(Month, Datediff(Month, 0, DATEADD(m, -4, current_timestamp)), 0)

【讨论】:

    【解决方案2】:

    让我们调用您的表 Enrollment。

    首先.. 我们希望所有在7-01-146-30-15 之间注册的人

    Select * 
    From Enrollment 
    Where Start_Date Between '7-01-14' and '6-30-15'
    And End_Date Between '7-01-14' and '6-30-15'
    

    此外,成员资格必须在该时间跨度内至少存在几个月。

    Select * 
    From Enrollment 
    Where Start_Date Between '7-01-14' and '6-30-15'
    And End_Date Between '7-01-14' and '6-30-15'
    And DateDiff (month, Start_Date, End_Date) > 4
    

    但请考虑以下情况:

    • 如果有人在“6-25-15”(截止日期前 5 天)注册并活跃了 4 个月会怎样?
    • 如果有人在“4-01-14”(开始截止前 3 个月)注册并活跃了 4 个月会怎样?

    在这种情况下,您必须对查询进行适当的更改,以便在需要时处理这些情况。

    例如,如果 Start_Date OR End_Date 可以在指定的截止日期之间,但成员资格仍需要 4 个月长

    Select * 
    From Enrollment 
    Where 
    (
        Start_Date Between '7-01-14' and '6-30-15'
        OR End_Date Between '7-01-14' and '6-30-15'
    )
    And DateDiff (month, Start_Date, End_Date) >= 4
    

    但是如果 Start_Date 小于 cutff 的开始,End_Date 大于 cutoff 的结束,并且成员资格仍然需要 4 个月长,该怎么办

    Select * 
    From Enrollment 
    Where 
    (
        (Start_Date Between '7-01-14' and '6-30-15' OR End_Date Between '7-01-14' and '6-30-15')
        OR
        (Start_Date < '7-01-14' and End_Date > '6-30-15')
    )
    And DateDiff (month, Start_Date, End_Date) >= 4
    

    【讨论】:

    • 不幸的是,由于 2 个原因,这不起作用,月份中的 datediff 可以是 3 个月和 1 天,但仍然包括在内。另一个原因是您缺少 start_date 和 end_date 超出区间的人
    • 您没有检查人们在间隔内成为会员的时间,基本上1天的会员资格在您的计算中是可以接受的,如果人们在间隔之前和之后都是会员,则不考虑他们
    【解决方案3】:

    这将适用于 sqlserver 2012。如果您使用的是早期版本,则可以替换 where 子句:

    DECLARE @t table(START_DATE date, END_DATE date)
    INSERT @t values
    ('2015-01-01','2015-08-30'),('2015-01-01','2015-12-30'),
    ('2015-08-01','2015-12-30'),('2015-11-01','2017-12-30'),
    ('2016-01-01','2017-12-30'),('2017-01-01','2017-12-30')
    
    DECLARE @from date='2015-7-01'
    DECLARE @to   date='2016-03-01'
    
    SELECT *
    FROM @t
    WHERE
      DATEADD(month,4, IIF(@from<START_DATE, START_DATE, @FROM)) <=
      IIF(@to>END_DATE, END_DATE, @to)
    
    /*
      --this is for sqlserver 2008
      DATEADD(month,4, CASE WHEN @from<START_DATE THEN START_DATE ELSE @FROM END) <=
      CASE WHEN @to>END_DATE THEN END_DATE ELSE @to END
    */
    

    【讨论】:

    • 感谢您的提示!
    猜你喜欢
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2011-12-11
    • 2021-08-15
    相关资源
    最近更新 更多