Sql server 在T-SQL中查找日期的差异

Sql server 在T-SQL中查找日期的差异,sql-server,tsql,Sql Server,Tsql,我的表格详情如下: Date ORGUnitCode SKUId LocationID LP DivisionCode DeptCode CategoryCode OPBalQty OPBalValue Sync 2013-03-31 00:00:00 DELG14 10059764 107 432.55 G MN KLO 0.00

我的表格详情如下:

Date                ORGUnitCode SKUId   LocationID  LP  DivisionCode    DeptCode    CategoryCode    OPBalQty    OPBalValue  Sync    
2013-03-31 00:00:00 DELG14  10059764    107       432.55    G           MN          KLO             0.00            0.00    0   
2013-03-31 00:00:00 DELG14  10063213    107       699.05    G           MN          KLO             0.00            0.00    0   
2013-03-31 00:00:00 DELG14  10090728    107       250.76    G           MN          PYJ             0.00            0.00    0   
在大量记录中,
OPBalQty
要么1.00要么0.00


我想为所有可用的
SKUId
找出自
OPBalQty
0.00以来的天数,将其重新表述为查找针对天数缺货的特定SKUId。我试图找到它,但没有工作,有人能指出这一点吗

根据你最近的评论,我相信这就是你想要的答案。希望你能看到这些是同一主题的变体,你可以根据需要进行调整

select
    SKUId,
    datediff(
        day,
        max(case when OPBalQty = 1 then "Date" end),
        max(case when OPBalQty = 0 then "Date" end)
    ) as NumDays

from T
group by SKUId
having max(case when OPBalQty = 0 then "Date" end) = max("Date")

先前的答案

如果您只想获得带有零
OPBalQty
的最新日期,那么您只需要查找可用于差异计算的
max()
日期

select
    SKUId,
    datediff(day, getdate(), max("Date")) as NumDays
from T
where OPBalQty = 0
group by SKUId
如果您只查找最近日期为零的SKU,则可以在
having
子句中使用各种检查

select
    SKUId,
    datediff(day, getdate(), max("Date") as NumDays
from T
group by SKUId
having max(case when OPBalQty = 0 then "Date" end) = max("Date")
-- this condition would also work if it seems clearer
-- max(case when OPBalQty=0 then "Date" end) > max(case when OPBalQty=1 then "Date" end)
当然,如果您只需要查看日期差异大于某个天数的SKU,只需将该条件添加到
having
中即可

select
    SKUId,
    datediff(day, getdate(), max("Date")) as NumDays
from T
group by SKUId
having  max(case when OPBalQty = 0 then "Date" end) = max("Date")
    and datediff(day, getdate(), max("Date")) >= X

针对所讨论问题的有针对性的解决方案:

select distinct SKUId,
        datediff( day,
        max(case when OPBalQty > 0 then "Date" end),
        max(case when OPBalQty = 0 then "Date" when OPBalQty = -1 then "Date" end)) as NumDays
    from Admin.Stocks
    group by SKUId
    having max(case when OPBalQty = 0 then "Date" end) = max("Date")   

您的标题和说明没有帮助。请您添加一些示例数据,并显示实际表中的一些数据的预期结果。您的示例数据的引用值均为0.00。尝试添加一些附加数据,然后添加一些示例输出,例如,您预期的天数。您还需要自上次值为1.00以来该值一直为0.00的连续天数,还是自上次值为0以来该值一直为1.00的连续天数。00@Matt,您可以想象一个项目每天在数据库中添加一行,并且在添加此记录时,OPBalQty为0.00表示此项目没有库存,1.00表示此项目有1个数量,依此类推。请注意,对于一些旧的日期(这意味着对于一些旧的行),此OPBalQty可以为0.00,但在此之后,它可能会大于0.00。所以,我想要的是股票最近一次涨到0.00的天数。我想我自己和其他人都理解你们的愿望——答案中潜移默化的是细微差别。例如,您需要天数,但数据库中的记录数或日期字段的datediff()是否介于最后0.00和当前记录或当前日期之间?我想我们已经完成了。中间的那个,谢谢。但是这将执行超过6亿行,你能推荐一些吗optimization@TraDev:我建议运行查询并查看它是否运行缓慢,如果运行缓慢,则将执行计划、表的架构、索引和ask作为单独的部分发布question@TraDev也许您想添加
其中的“Date”>=“20160101”
或其他内容。如果您确定在这段时间内不会有任何缺货,那么假设索引和所有这些,可能会改进查询。@shawnt00,这正是我想要解决的业务问题。我已经定制了我的要求,并在这里更新,谢谢!因为我的表在这里,所以我想扩展这个问题,以捕获我刚刚计算过的那些日期,但只有30个日期(最新日期,可能是单个变量)。@TraDev我不太明白,但听起来好像你想要
其中“date”>=dateadd(day,-30,getdate())
其中“date”>=@startDate