【问题标题】:1 part of case clause not working correctly1部分案例条款无法正常工作
【发布时间】:2012-04-30 11:07:42
【问题描述】:

我在使用 case 子句时遇到了一点麻烦。问题出在以 DueBeyond 结尾的最后一部分,我需要这个来返回我们系统中任何明天之后到期的订单,比如从今天起 2 天。抱歉说得太明显了。

SUM(CASE WHEN CURRENT_TIMESTAMP > oi.RequiredByDate THEN 1 ELSE 0 END) as PastDue
,SUM(CASE WHEN DATEADD(dd, DATEDIFF(dd, 0, oi.RequiredByDate), 0) = dateadd(day,     datediff(day, '19000101',CURRENT_TIMESTAMP),'19000102') then 1 ELSE 0 END) as DueTomorrow
,SUM(CASE WHEN dbo.TruncateDate(CURRENT_TIMESTAMP) = dbo.TruncateDate(oi.RequiredByDate) THEN 1 Else 0 END) as DueToday
,SUM(CASE WHEN DateDiff(day, getdate(), RequiredByDate) BETWEEN 2 and 7 AND DateName(weekday, RequiredByDate) = 'Monday' Then 1 ELSE 0 END) as DueMonday
,SUM(CASE WHEN dbo.TruncateDate(CURRENT_TIMESTAMP) <= dbo.TruncateDate(oi.RequiredByDate) THEN 1 ELSE 0 END) as DueBeyond

【问题讨论】:

  • 有什么问题?一些示例输入和预期/实际输出将有助于使这个问题得到回答。
  • 很抱歉缺少对此有点新的数据
  • 我在 sql server 2005 上,我希望它根据客户的预期交货日期计算我们数据库中的客户订单,并在表格中告诉我每个客户订单有多少处于每个交货状态(今天到期,逾期等)我需要的唯一列是clients.name和case子句中创建的列。我正在使用 Telerik 报告将这些数据传输到 vs 2010 中的条形图和/或饼图。您需要更多信息吗?

标签: sql tsql date time case


【解决方案1】:

如果您将当前日期加上两天,然后查看该日期是否仍小于或等于您要求的日期,则不得早于未来两天。

,SUM(CASE WHEN DATEADD(DAY, 2,dbo.TruncateDate(CURRENT_TIMESTAMP)) <= 
     dbo.TruncateDate(oi.RequiredByDate) THEN 1 ELSE 0 END) as DueBeyond 

【讨论】:

  • 谢谢,但现在我有一个新问题,我有这个和另一个需要返回相同数据的查询。其中一个或两个都不正确,但我不知道是哪个。你能告诉我吗?
  • 选择 cl.Name 作为 Client,clb.Name 作为 ClientBranch,CASE WHEN CURRENT_TIMESTAMP > oi.RequiredByDate THEN 'Past Due' WHEN dbo.TruncateDate(CURRENT_TIMESTAMP) = dbo.TruncateDate(oi.RequiredByDate) THEN '今天​​到期' WHEN DATEADD(dd, DATEDIFF(dd, 0, oi.RequiredByDate), 0) = dateadd(day, datediff(day, '19000101',CURRENT_TIMESTAMP),'19000102') 然后 '明天到期' WHEN DateDiff( day, getdate(), RequiredByDate) BETWEEN 2 and 7 AND DateName(weekday, RequiredByDate) = 'Monday' Then 'Due Monday' WHEN DATEADD(DAY, 2,dbo.TruncateDate(CURRENT_TIMESTAMP))
  • dbo.TruncateDate(oi.RequiredByDate) THEN 'Due Beyond' ELSE '此报告有问题' END AS DeliveryStatus FROM OrderItems oi JOIN Orders o ON o.OrderID = oi.OrderID JOIN Counties c ON c.FIPS = o.FIPS JOIN Clients cl ON cl.ClientID = o.ClientID JOIN Milestones m ON m.MilestoneID = oi.LastMilestoneID JOIN Products p ON p.ProductID = oi.ProductID JOIN Vendors v ON v.VendorID = oi .VendorID LEFT JOIN ClientBranches clb ON clb.ClientID = o.ClientID WHERE QueueID > 0
  • with cte AS (SELECT cl.Name, SUM(CASE WHEN CURRENT_TIMESTAMP > oi.RequiredByDate THEN 1 ELSE 0 END) as PastDue ,SUM(CASE WHEN DATEADD(dd, DATEDIFF(dd, 0, oi .RequiredByDate), 0) = dateadd(day, datediff(day, '19000101',CURRENT_TIMESTAMP),'19000102') then 1 ELSE 0 END) as DueTomorrow ,SUM(CASE WHEN dbo.TruncateDate(CURRENT_TIMESTAMP) = dbo.TruncateDate( oi.RequiredByDate) THEN 1 Else 0 END) as DueToday ,SUM(CASE WHEN DateDiff(day, getdate(), RequiredByDate) BETWEEN 2 and 7 AND DateName(weekday, RequiredByDate) = 'Monday' Then 1 ELSE 0 END) as DueMonday
  • ,SUM(CASE WHEN DATEADD(DAY, 2,dbo.TruncateDate(CURRENT_TIMESTAMP)) 0 GROUP BY cl.Name ) Select * FROM cte
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 2020-12-19
  • 2018-06-08
相关资源
最近更新 更多