所以我需要添加一些日期,比如说30,但30天不能是日历天,它们是依赖于某些逻辑的参数,所以我需要找到一种方法来添加日期之间星期三和星期三之间的30天,例如: 如果我添加30(星期三到星期三)到2月15日,我应该得到4月26日 如果我添加30(太阳到星期五) 15日,我应该得到3月17日SQL server DATEADD特定的周日
如果情况不够清楚,让我知道蚂蚁我会尽力给出一个更好的解释。
谢谢。
所以我需要添加一些日期,比如说30,但30天不能是日历天,它们是依赖于某些逻辑的参数,所以我需要找到一种方法来添加日期之间星期三和星期三之间的30天,例如: 如果我添加30(星期三到星期三)到2月15日,我应该得到4月26日 如果我添加30(太阳到星期五) 15日,我应该得到3月17日SQL server DATEADD特定的周日
如果情况不够清楚,让我知道蚂蚁我会尽力给出一个更好的解释。
谢谢。
我第一次产生了一系列的起始日期和结束日期之间的日期,但它返回星期几:
SELECT DATEPART(weekday, DATEADD(DAY, nbr - 1, @StartDate)) as dow
FROM (SELECT ROW_NUMBER() OVER (ORDER BY c.object_id) AS Nbr
FROM sys.columns c
)nbrs
WHERE nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate)
然后你可以使用一个简单的WHERE IN()来选择你想包含的星期几,并计算返回的日期。
DECLARE @StartDate DATE = '20170101'
, @EndDate DATE = '20170131'
SELECT COUNT(*) AS DAYS
FROM (
SELECT DATEPART(weekday, DATEADD(DAY, nbr - 1, @StartDate)) as dow
FROM (SELECT ROW_NUMBER() OVER (ORDER BY c.object_id) AS Nbr
FROM sys.columns c
)nbrs
WHERE nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate)
) T1
WHERE DOW IN (3,4,5);
时请小心您的SQL Server一周的冷杉一天,你可以用SET DATEFIRST改变它。
我会用递归CTE,这样做:
-- set datefirst as Sunday. You may need to adjust it ot the correct Datefirst value for your locale
SET DATEFIRST 7
declare @d datetime
set @d = '2017-02-15'
SELECT @d
;with
days as(
-- this CTE where you define the active days. The days start
select 1 as d, 0 as active -- sunday
union
select 2 as d, 1 as active -- monday
union
select 3 as d, 1 as active
union
select 4 as d, 1 as active
union
select 5 as d, 0 as active
union
select 6 as d, 0 as active
union
select 7 as d, 0 as active -- saturday
),
n as (
select CASE WHEN DATEPART(dw, DATEADD(d, 1, @d)) IN (select d from days where active=1) THEN 1 ELSE 0 END as n, @d as dt
union all
select CASE WHEN DATEPART(dw, DATEADD(d, 1, dt)) IN (select d from days where active=1) THEN n+1 else n end, DATEADD(d, 1, dt)
from n where n < 30)
--SELECT * from n order by n
SELECT top 1 @d = dt from n order by n desc
select @d
以上查询是周一至周三为了让孙周五修改的有效标志在天CTE
这可能工作,因为我得到的天数(0 =星期日,7 =星期六),我可以使用CASE当......在CTE,我会尝试这种方法。谢谢! – rhernandez
这个效果很好,但是生产速度可能会很慢 – rhernandez
您的意思是工作日? – McNets
@McNets很好,有点,但不仅工作日,它可能是星期五到星期五,星期一到星期二......它变化很大,但如果有一种方法可以定义工作日在每个查询中需要的日子,我可以与该工作 – rhernandez
你有一个查找日历表? – McNets