Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果两个日期之间的日期差为X,则如果是Y,则执行此操作,然后执行其他操作_Sql_Sql Server_Tsql_Sql Server 2012 - Fatal编程技术网

Sql 如果两个日期之间的日期差为X,则如果是Y,则执行此操作,然后执行其他操作

Sql 如果两个日期之间的日期差为X,则如果是Y,则执行此操作,然后执行其他操作,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,我的开始日期是2009年4月4日,结束日期是getdate 我需要计算从开始日期到今天的每个日期的一些事情。 我还需要将其分为两种情况: 案例1:例如,如果是周五,我需要回到347天 select datediff(dw, '2010-11-22','2011-11-04') select datediff(dw, '2010-11-19','2011-11-03') 对于每个星期五,然后执行一些选择 案例2:例如,如果是从周一到周四,那么可以追溯到349天 select datedi

我的开始日期是2009年4月4日,结束日期是getdate

我需要计算从开始日期到今天的每个日期的一些事情。 我还需要将其分为两种情况:

案例1:例如,如果是周五,我需要回到347天

select datediff(dw, '2010-11-22','2011-11-04')
   select datediff(dw, '2010-11-19','2011-11-03')
对于每个星期五,然后执行一些选择

案例2:例如,如果是从周一到周四,那么可以追溯到349天

select datediff(dw, '2010-11-22','2011-11-04')
   select datediff(dw, '2010-11-19','2011-11-03')
我该怎么写呢?我需要做的事情与此无关,只是说:

declare @startDate date
declare @endDate date
declare @dateHolder date
declare @tsID int
set @startDate = '2009-04-01'
set @endDate = getdate()
set datefirst 1;


while (select count (tsID) from #tempI)>0
            begin
            select top 1 @tsID = tsID from #tempI
                while (select count (rateDate) from #tempI)>0
                begin
                    select top 1 @dateHolder = rateDate from #tempI
                      case (select datename  (dw, @dateHolder) = '5' then  someColumn = @dateHolder - 347 as dateIneedToUseForMyFormula
                      case (select datename (dw, @dateHolder) = '1' or '2' or '3' or '4' then someColumn = @dateHolder - 349 as dateIneedToUseForMyFormula
-- here i don't know how to write the code, so i'll write pseudo
-- i have tsID rateDate and rate
-- i need to put in a new column (the value obtained from taking the value
-- from the column rate corresponding to the  @dateHolder - the value from
-- the column rate corresponding to the @dateHolder - 347 or 349 
-- depending on the case) * 100

                end
            delete from #tempI where @dateHolder = rateDate
        end
    delete from #tempI where @tsID = tsID
    end
编辑 评论中有人问我该怎么办,但由于投了反对票,我想我没有说清楚。我将复制粘贴我在评论中写的内容:
首先遍历列表中的所有tsID,然后遍历所有日期,从中减去349或347天的日期,然后选中并将结果放入一个新列:与我的日期相对应的“rate”列的值-与349或347天前的日期相对应的“rate”列的值。对每个id的所有日期执行此操作

编辑2:预期输出

试试这个

Declare @start Date='2009-09-01', @end Date=getdate();
;With NumberSequence( Number ) as
(
    Select @start as Number
        union all
    Select DATEADD(d,1,Number)
        from NumberSequence
        where Number < @end
)
Select 
(CASE WHEN (datepart(dw,Number) =6)  THEN DATEADD(d,-347,Number)
     ELSE DATEADD(d,-349,Number)
     END ) AS Date
From NumberSequence Option (MaxRecursion 10000)

在工作日使用case语句:

Select Case 
    When WeekDAy(yourdate, 3) < 4 then datediff(dw, '2010-11-19','2011-11-03')
    when WeekDAy(yourdate, 3) = 4 then datediff(dw, '2010-11-22','2011-11-04')
    Else ...?... End

请确定你正在使用的SQL Server版本。SQL Server 2012,语法不应该与2008太不同:提示:你可能想考虑使用DeDePoT和比较整数,而不是用笪特娜么和Struts来摆弄。谢谢,但是我怎么把它加入到我的迭代过程中呢?还有,你为什么把6放在这里?当datepartdw,Number=6时,在我的代码中使用datefirst=1。不应该是5吗?@viorelmunteanu我没有得到你想要的东西??首先遍历列表中的所有tsID,然后遍历所有日期,从中减去349或347天,然后选中并在新列中输入以下结果:与我的日期相对应的“汇率”列的值-与349或347天前的日期相对应的“汇率”列的值。这对每个id的所有日期都执行。这取决于您首先输入的日期,如果是1,则6应替换为5。我刚刚进行了编辑,请在原始问题中查找