【问题标题】:if the date difference between two dates is X do this if is Y do something else如果两个日期之间的日期差为 X 则执行此操作 如果 Y 执行其他操作
【发布时间】:2015-09-07 14:05:00
【问题描述】:

我的开始日期是 2009-04-01(2009 年 4 月 4 日),结束日期是 getdate()。

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

案例1:如果是星期五我需要返回347天,例如

select datediff(dw, '2010-11-22','2011-11-04')

每个星期五,然后执行一些选择。

案例 2:如果是从周一到周四,则返回 349 天,例如

   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

编辑 在 cmets 中我被问到该做什么,并且考虑到反对票,我认为我没有说清楚。我将复制粘贴我在评论中写的内容: " 首先遍历列表中的所有 tsID,然后遍历所有日期,得到一个从中减去 349 或 347 天的日期,然后检查将结果放入一个新列:'rate'的值对应于我的日期的列 - 对应于 349 或 347 天前的日期的“比率”列的值。这对每个 id 的所有日期执行“

编辑 2:预期输出

 tsID rateDate     rate    calculated 
  1    2009-04-01  0.12     null 
  1    2009-04-02  0.14     null 
  1    2009-04-03  0.11     null 
  2    2009-04-01  0.01     null 
  2    2009-04-02  0.012    null
  2    2009-04-03  0.43     null 
. . . 347 days later or 349 depending
     on what 2009-04-01 was 
  1   2010-03-16   0.454   (0.454 - 0.12)*100
  1   2010-03-17   0.34    (0.34 - 0.14)*100 
  1   2010-03-18   0.9     (0.9 - 0.11)*100 
then same for id 2.3...4...

【问题讨论】:

  • 请确定您使用的 sql server 版本。
  • SQL sever 2012,语法不应该与 2008 相差太大 :)
  • 提示:您可能需要考虑使用DatePart 并比较整数,而不是摆弄DateName 和字符串。

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

试试这个

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)

【讨论】:

  • 谢谢,但我如何将其纳入我的迭代过程?另外,你为什么把6放在这里? CASE WHEN (datepart(dw,Number) =6) ,在我的代码中我使用 datefirst = 1。不应该是 5?
  • @viorelmunteanu m 没有得到你想要的??
  • 首先遍历列表中的所有 tsID,然后遍历所有日期,得到一个减去 349 或 347 天的日期,然后检查将结果放入新列:与我的日期相对应的“汇率”列的值 - 与 349 或 347 天前的日期相对应的“汇率”列的值。这对每个 id 的所有日期执行。
  • 这取决于你在 datefirst 中输入的内容,如果是 1,则 6 应替换为 5。
  • 我刚刚做了修改,请在原问题中找到
【解决方案2】:

在工作日使用 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

【讨论】:

    猜你喜欢
    • 2021-02-10
    • 2021-06-19
    • 1970-01-01
    • 2016-08-20
    • 2023-01-12
    • 2013-01-19
    • 2021-10-27
    • 2016-03-24
    • 2023-03-09
    相关资源
    最近更新 更多