如何根据给定的天数从给定的开始日期获取下一个日期 [英] How to fetch next date from given start date according to given days

查看:90
本文介绍了如何根据给定的天数从给定的开始日期获取下一个日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个名为Days的表有以下字段



 StartDate Days 
17-06-2015星期三,星期五,星期一









我想从开始日期获取下一个日期根据天栏中提到的天数



对于Ex。

 日期
17-06-2015周三
19-06-2015周五
22-06-2015周一

解决方案

有一个技巧。我包含的示例仅用于说明目的。你必须打破逻辑,然后创建一个函数:



  / *   

诀窍是一周中的几天都有数值。
星期一= 1,
星期二= 2,
...
星期日= 7

这些可以用来计算下一次出现

我的第一个CTE创建出现日期表

* /

WITH DaysOfOccurrence < span class =code-keyword> AS (
SELECT 1 < span class =code-keyword> AS [datepart],' monday' < span class =code-keyword> AS [dayofweek]
UNION SELECT 4 ' thursday'
UNION SELECT 7 ' sunday'
),
- 下一个CTE创建了一大堆用于测试的初始日期
StartDates AS
SELECT GETDATE() AS startdate
UNION SELECT DATEADD(DAY,-1,GETDATE())
UNION SELECT DATEADD(DAY,-2,GETDATE())
UNION SELECT DATEADD(DAY,-3,GETDATE())
UNION SELECT DATEADD(DAY,-4,GETDATE())
UNION SELECT DATEADD(DAY,-5,GETDATE())
UNION SELECT DATEADD(DAY,-6,GETDATE())
UNION SELECT DATEADD(DAY,-7,GETDATE())
),
- 现在我们创建一些候选日期:
datecandidates AS

SELECT
doc.datepart,
sd.startdate,
DATEADD(DAY,doc.datepart, - 添加出现的dayofweek数字
DATEADD(DAY,-DATEPART(WEEKDAY,sd.startdate),sd.startdate) - 减去startdate dayofweeknumber(上一个星期日)
AS 候选人 - 我们的候选人现在是我们在周日之前开始的一系列事件startdate
FROM StartDates sd,DaysOfOccurrence doc

- 上面的候选日期可能为时太早,所以我们得到周+ 1次出现
UNION SELECT
doc.datepart,
sd.startdate,
DATEADD(DAY, 7 ,DATEADD(DAY,doc.datepart,DATEADD(DAY,-DATEPART(WEEKDAY,sd.startdate),sd.startdate)))
FROM StartDates sd,DaysOfOccurrence doc

- 我们现在有一个候选填充列表,可以从中选择
SELECT CAST(MIN(dc.startdate) AS NVARCHAR 11 )),CAST(MIN(dc.candidate) ) AS NVARCHAR 11 ))< span class =code-comment> - 我们想要下一个最小值
FROM datecandidates dc
WHERE dc.candidate> dc.startdate - 我们不希望在startdat之前有任何值
GROUP BY dc.startdate

/ *
您可以换掉任何日期的开始日期,然后您将在该日期之后获得下一次出现。

从第二个CTE可以看出,我使用的日期之一是GETDATE(),即今天
* /





结果:

 2015年6月9日= 2015年6月10日
2015年6月10日= 2015年6月13日
2015年6月11日= 2015年6月13日
2015年6月12日= 2015年6月13日
2015年6月13日= 2015年6月14日
2015年6月14日= 2015年6月17日
2015年6月15日= 2015年6月17日
2015年6月16日= 2015年6月17日







希望有所帮助^ _ ^


I have one table called Days having following fields

StartDate    Days
17-06-2015   Wednesday,Friday,Monday





I want to fetch next date from start date according to days mentioned in days column

For Ex.

Date         Day
17-06-2015   Wednesday
19-06-2015   Friday
22-06-2015   Monday

解决方案

There is a trick to this. The example I include is for explanatory purposes. You will have to break down the logic and maybe create a function off of the back of it:

/*

The trick is that days of the week have numeric values. 
Monday = 1,
Tuesday = 2,
...
Sunday = 7

These can be used to calculate the next occurence

My first CTE creates the dates of the occurences table  

*/
WITH DaysOfOccurrence AS (
 SELECT 1 AS [datepart], 'monday' AS [dayofweek]
 UNION SELECT 4, 'thursday'
 UNION SELECT 7, 'sunday'
 ),
 -- This next CTE creates a whole bunch of startdates to test with
StartDates AS (
 SELECT GETDATE() AS startdate
 UNION SELECT DATEADD(DAY,-1,GETDATE())
 UNION SELECT DATEADD(DAY,-2,GETDATE())
 UNION SELECT DATEADD(DAY,-3,GETDATE())
 UNION SELECT DATEADD(DAY,-4,GETDATE())
 UNION SELECT DATEADD(DAY,-5,GETDATE())
 UNION SELECT DATEADD(DAY,-6,GETDATE())
 UNION SELECT DATEADD(DAY,-7,GETDATE())
 ),
 --Now we create some date candidates:
datecandidates AS (

 SELECT 
	doc.datepart,
	sd.startdate,  
	DATEADD(DAY,doc.datepart, --add the occurence dayofweek number
	DATEADD(DAY, -DATEPART(WEEKDAY,sd.startdate),sd.startdate) -- subtract the startdate dayofweeknumber (previous sunday)
	) AS candidate -- our candidate is now a list of our occurences started from the sunday BEFORE our startdate
 FROM StartDates sd, DaysOfOccurrence doc

 -- the candidate dates above may be too early, so we get week+1 occurrences also
 UNION SELECT 
	doc.datepart,
	sd.startdate,  
	DATEADD(DAY,7, DATEADD(DAY,doc.datepart, DATEADD(DAY, -DATEPART(WEEKDAY,sd.startdate),sd.startdate)))
 FROM StartDates sd, DaysOfOccurrence doc
 )
 --We now have a fill list of candidates and can select from them
 SELECT CAST( MIN(dc.startdate) AS NVARCHAR(11)),  CAST( MIN(dc.candidate) AS NVARCHAR(11)) -- We want the next smallest value
 FROM datecandidates dc
 WHERE dc.candidate > dc.startdate -- we do not want any values before the startdat
 GROUP BY dc.startdate

/*
You can swap out the startdate for any date and you will get the next occurence after that date.

As you can see fromn the second CTE, one of the dates i use is GETDATE(), i.e. today
*/



Results:

Jun  9 2015	=	Jun 10 2015
Jun 10 2015	=	Jun 13 2015
Jun 11 2015	=	Jun 13 2015
Jun 12 2015	=	Jun 13 2015
Jun 13 2015	=	Jun 14 2015
Jun 14 2015	=	Jun 17 2015
Jun 15 2015	=	Jun 17 2015
Jun 16 2015	=	Jun 17 2015




Hope that helps ^_^


这篇关于如何根据给定的天数从给定的开始日期获取下一个日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆