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

我试图在SQL查询中使用
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
发生了几件事

  • 因为我当前的GETDATE()是2014年8月28日,所以上面的状态不应该是2。因为它不小于或等于开始日期后30分钟
  • 因为这本身是错误的,它可能导致第二个问题——因为它被标记为2,它应该出现在3之前,而不是之后
    这是一个简单的逻辑错误。您将“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),但我仍然会遇到一些奇怪的错误。