【问题标题】:SQL Server - calculating continuous membershipSQL Server - 计算连续成员资格
【发布时间】:2017-02-14 17:37:57
【问题描述】:

这是我正在尝试执行的计算逻辑:我必须计算不断加入会员资格的成员。例如,John 会员资格于 2017 年 1 月 1 日结束,但他在 2017 年 2 月 15 日之前再次加入,则他被视为合格会员,但如果他在 45 天后加入,则不符合会员资格。我尝试使用排名功能以及尝试使用DATEDIFF 功能,似乎不起作用。

有人可以帮忙吗?提前致谢。

| ID | NAME  | TERMINATIONDATE | STARTDATE |
|------------------------------------------|
| 2  | John  | 1-1-2017        | 2-16-2017 |
| 3  | Harry | 12-1-2016       | 1-1-2016  |
| 4  | Rob   | active          | 1-1-2015  |

所以我需要未终止的 ID 计数,如果它们在终止 45 天后终止并开始,则也将其计为合格成员。

【问题讨论】:

  • 样本数据和预期结果会有所帮助并消除假设
  • 很抱歉:
  • 添加了示例数据,但在一行中。
  • 您的样本与您在问题中的解释不完全相符。您说约翰于 2017 年 2 月 15 日加入,但您的样本的开始日期为 2017 年 2 月 16 日。错字?
  • 嗨,克里斯,情况是这样的;约翰于 2017 年 1 月 1 日终止并于 2017 年 2 月 16 日重新开始,即过去的天数不超过 45 天。所以我想把约翰算作一个连续的成员,而任何有超过 45 天的成员差距的人都不算在内。这有意义吗?

标签: sql-server tsql datediff


【解决方案1】:

您可以只使用 dateadd 函数来比较开始日期和终止日期:

select
count(*)
from members
where isnull(termination_date,'') = ''
or dateadd(d,45,termination_date) > start_date

我在您的示例数据中注意到的一件事是“活动”的值在终止日期列中。如果您的数据是这样的,我建议您不要这样做,而是为所有没有终止日期的成员使用值 NULL。

已编辑: 如果您的终止日期实际上是“字符串类型”,则可以使用以下查询来清除“活动”值:

select
count(*)
from members
where termination_date = 'active'
or dateadd(d,45, replace(termination_date,'active','')) > start_date

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多