【问题标题】:SQL unable to find DateDiffSQL 找不到 DateDiff
【发布时间】:2014-01-02 15:22:02
【问题描述】:

我目前正在创建 SQl,我需要在两个日期之间找到 DateDiff。

我的示例表

Sno ItemId   LineItemId CurrentEndDate     RStartDate      REndDate
 
1   101      541        10/12/2013          11/12/2013  10/12/2014

2   101      542        10/01/2014          10/01/2014  12/12/2014 

3   101      543        09/01/2014          11/01/2014  10/01/2016 

4   102      544        10/12/2013          11/12/2013  10/12/2014 

5   102      589        10/12/2013          11/12/2013  10/12/2014 
                

我有以下条件:

  1. CurrentEndDate 应该是 Today-30 和 Today+365。
  2. RstartDate 和 REndDate 之间的差值应大于年 (365)。

如果每个 ItemId 的所有条件都满足,那么我将显示 Valid Else Not Valid。

注意:所有行都应满足上述条件。

我编写了一个 SQL,但无法找到正确的方法来获取 RstartDate 和 REndDate 的 DateDiff。

输出:

预期结果:

ItemId 结果

 101   NotValid
 102   Valid

但得到以下结果:

ItemId 结果

 101    Valid   
 101    NotValid    
 102    Valid   

SQL

 Select ItemId,
    Case:
          (Cast(DATEDIFF(DAY,MIN(CurrentEndDate) OVER(PARTITION BY ITemId),GETDATE()) AS int) < 30 
        AND Cast(DATEDIFF(DAY,MIN(CurrentEndDate) OVER(PARTITION BY ITemId),GETDATE()) AS int) > -365)
    AND (Cast(DATEDIFF(DAY,MAX(CurrentEndDate) OVER(PARTITION BY ITemId),GETDATE()) AS int) < 30 
                              AND Cast(DATEDIFF(DAY,MAX(CurrentEndDate) OVER(PARTITION BY ITemId),GETDATE()) AS int) > -365)
    AND CAST(DATEDIFF(DAY,RStartDate,REndDate) + 1 AS int) >= 365
THEN 'QUOTED'
                            else 'Not Valid'
End  As Result
    From ItemTable

解释:

  1. 对于 CurrentEndDate,我为每个 ItemId 找到了 Max 和 Min,并应用了条件 1。考虑 Max 和 Min 是否满足行间的其余部分也将满足。
  2. 但我不确定如何为 Rstartdate 和 RendDate 应用 DateDiff。 因为我需要单独为每一行应用条件 2..

注意:对于第 2 行,RstartDate 和 REndDate 的差异不超过 365。

请帮忙...

【问题讨论】:

  • (Cast(DATEDIFF(DAY,MIN(CurrentEndDate) OVER(PARTITION BY ITemId),GETDATE()) AS int)
  • 是的,应该是 > 错字错误..我已经更改了它,我有一个下限,即日期应该从今天起不超过 30 天,并且不超过从今天起不超过 1 年
  • 我不明白您是如何对 itemid 102 有效的。Currentdate 在两者上都是相同的,并且它与今天之间的 DateDiff 是 82。82 不在 30 和 -365 之间。我离这儿很远吗?
  • @user3083310 我使用的是英国日期格式 DD/MM/YYYY。所以日期差异将是 24 天..

标签: c# sql sql-server tsql datediff


【解决方案1】:

你的规则有问题。

看这个更详细。


        (Cast(DATEDIFF(DAY,MIN(CurrentEndDate) OVER(PARTITION BY ITemId),GETDATE()) AS int) < 30 
        AND Cast(DATEDIFF(DAY,MIN(CurrentEndDate) OVER(PARTITION BY ITemId),GETDATE()) AS int) < -365)

如果最后一行是 fase,则上面的行也将是 false。如果一个结果是假的,如果它小于 -365,它也将小于 30。可能使用介于 0 和 30 之间以及介于 -365 和 0 之间。或者可能然后使用介于 -365 和 30 之间并跳过一个。

(Cast(DATEDIFF(DAY,MIN(CurrentEndDate) OVER(PARTITION BY ITemId),GETDATE()) AS int) between -365 and 30)

我使用 group by 更改了代码,正如我在您的请求中看到的那样,只希望每个 itemid 有一个输出,所以这可能有效。如果您不确定什么是失败的,您可以将 'QUOTED' 更改为 'QUOTED1' 和 'QUOTED2'。

要使用between,我需要制作一个如果失败则输出1的内箱,并确认总和为0。


Select 
    ItemId,
    Case 
        when sum(
                    case when DATEDIFF(DAY,CurrentEndDate, GETDATE())  between -365 and 30 then 0 else 1 end
                ) = 0 THEN 'QUOTED'
        when min(DATEDIFF(DAY,RStartDate,REndDate)) > 365 THEN 'QUOTED'
        else 'Not Valid'
    End  As Result
    From ItemTable
    group by ItemId

【讨论】:

  • 是的,你是对的,我会改变.. 但需要帮助来处理我的第二种情况
  • Daniel 谢谢.. 我不想使用 group by 语句,因为我的原始查询将有多个表连接.. 但我会尝试实施您的解决方案,看看它是否适合我...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2021-11-29
  • 2022-09-25
相关资源
最近更新 更多