SQL中的自定义排序
我试图在SQL查询中使用SQL中的自定义排序,sql,sql-server,tsql,sql-order-by,ssms,Sql,Sql Server,Tsql,Sql Order By,Ssms,我试图在SQL查询中使用CASE语句在orderby子句中实现一个“自定义”排序,但它给了我一些奇怪的排序 以下是我迄今为止的订购依据条款: 编辑以反映更新: ORDER BY CASE WHEN CheckInStatus <> 'Cancelled' AND ArrivalTime is null AND GETDATE() > DATEADD(mi,30, CAST(StartDateTime AS DATETIME))THEN 1 W
CASE
语句在orderby
子句中实现一个“自定义”排序,但它给了我一些奇怪的排序
以下是我迄今为止的订购依据条款:
编辑以反映更新:
ORDER BY
CASE WHEN
CheckInStatus <> 'Cancelled' AND ArrivalTime is null AND GETDATE() > DATEADD(mi,30, CAST(StartDateTime AS DATETIME))THEN 1
WHEN
CheckInStatus <> 'Cancelled' AND ArrivalTime is null AND GETDATE() <= DATEADD(mi,30, CAST(StartDateTime AS DATETIME)) THEN 2
WHEN ArrivalTime is not null THEN 3
WHEN CheckInStatus='Cancelled' THEN 4
ELSE 5
END,
StartDateTime, ScanTechName
Arrival Time | CheckIn Status | StartDateTime | OrderStatus
----------------------------------------------------------------------------------
2014-08-15 08:00:07.123 | Arrived | 2014-08-15 07:15:00.000 | 3
----------------------------------------------------------------------------------
2014-08-15 07:47:48.643 | Arrived | 2014-08-15 07:30:00.000 | 2
发生了几件事
这是一个简单的逻辑错误。您将“StartDateTime”与(“StartDateTime”+30分钟)进行比较,后者将始终返回true。我猜你会希望与当前时间进行比较,这会使它看起来像这样:
ORDER BY
CASE WHEN
CheckInStatus <> 'Cancelled' AND ArrivalTime is null AND getdate() > DATEADD(mi,30, CAST(StartDateTime AS DATETIME))THEN 1
WHEN
CheckInStatus <> 'Cancelled' AND ArrivalTime is null AND getdate() <= DATEADD(mi,30, CAST(StartDateTime AS DATETIME)) THEN 2
WHEN ArrivalTime is not null THEN 3
WHEN CheckInStatus='Cancelled' THEN 4
ELSE 5
END,
StartDateTime, ScanTechName
orderby
当
CheckInStatus“Cancelled”和ArrivalTime为null,getdate()>DATEADD(mi,30,CAST(StartDateTime为DATETIME))则为1
什么时候
CheckInStatus“已取消”,ArrivalTime为null,getdate()您的这部分情况似乎是问题的原因:
CAST(StartDateTime AS DATETIME) > DATEADD(mi,30, CAST(StartDateTime AS DATETIME))
[StartDateTime]永远不会超过同一日期加30分钟!你的第二个条件也是这样
如果这不能解决您的问题,您可以提供有关此查询结果的更多信息吗?您可以设置sql fiddle吗?此“CAST”(StartDateTime为DATETIME)的含义是什么它的意思是:任命的开始日期时间,正如下面的评论指出的那样,这是永远不会发生的,我已经更新了我的原始帖子,以反映更新和发布!你完全正确-我需要将其更改为实际的GETDATE()-我将进行编辑,看看是否仍遇到任何问题。现在,我已将其更新为使用GETDATE()不是开始日期,我仍然收到错误--你能提供一个例子,说明你期望的结果和当前查询返回的结果吗?刚刚用更新的查询编辑了我的原始帖子,一些示例结果显示IssueTHak you for the update,你是否复制/粘贴SELECT子句中的CASE开关以输出此结果?我是k这是因为ORDER子句在默认情况下是升序的(您的子句就是这种情况),而您的示例是降序的…请确保问题中显示的查询与您测试的查询相同。实际上,我编辑了ORDER by以遵循GETDATE()(而不是StartDate),但我仍然会遇到一些奇怪的错误。