我有一个数据库TableA
类似以下内容:的SQL Server:查找日期给出结束日期和#天,具体日期不包括天范围
Id | Status | Start | End
1 | Illness | 2013-04-02 | 2013-04-23
2 | Illness | 2013-05-05 | 2014-01-01
3 | Vacation | 2014-02-01 | 2014-03-01
4 | Illness | 2014-03-08 | 2014-03-09
5 | Vacation | 2014-05-05 | NULL
想象一下,随时追踪特定用户的“离开”天。鉴于以下输入:
SomeEndDate
(日期),NumDays
(整数)
我想找到SomeStartDate
(日期),即从EndDate
Numdays
非发病天。换句话说,假设我给出了一个SomeEndDate
值'2014-03-10'和一个NumDays
值60;匹配SomeStartDate将是:
- 2014年3月10日2014年3月9日向= 1
- 2014年3月8日到2014年1月1日= 57
- 2013年5月5日到2013-05-03 = 2
因此,在60个非疾病日期,我们得到'2013-05-03'的SomeStartDate
。有什么简单的方法可以在SQL中完成这个任务吗?我想我可以每天循环,检查它是否落入其中一个疾病范围,并且如果没有,则增加一个计数器(在计数器= @numdays之后退出循环)......但这看起来非常低效。感谢任何帮助。
不完全确定我理解你的表,但我想我会尝试在两个单独的计算中做到这一点。从您的enddate减去您的天数。计算疾病日数,并将其添加到您之前的结果中。 – Andrew
要非常小心你如何解释范围。通常,仅限日期的范围是完全关闭的时间间隔。例如,3月9日至3月10日通常会被视为*两天*,而不是一天。 (当然,如果涉及时间的话,那就完全不同了。) –
安德鲁 - 我早就想过了,但是无法说服自己这是好方法(也许我错了!)。如果我从EndDate中抽取60天并添加@count疾病日期以获得StartDate = dateadd(d, - (60 + @ count),EndDate),那么我的新StartDate可能会落在另一个疾病范围内,或者包含额外的疾病天。所以我会循环这个,直到新的StartDate没有落在疾病范围内或包含额外的疾病日子? – AliceSmith