我有一个带有datetime字段的SQL表。所讨论的字段可以为空。我有一个查询,我想要的结果排序由datetime字段上升,但我想要的行,其中的datetime字段是空在列表的结束,而不是在开始。

有什么简单的方法可以做到吗?


当前回答

order by -cast([nativeDateModify] as bigint) desc

其他回答

order by coalesce(date-time-field,large date in future)
select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate

使用NVL函数

  select * from MyTable order by NVL(MyDate, to_date('1-1-1','DD-MM-YYYY'))

以下是最著名的DBMS中NVL的替代方案

解决方案使用“case”是通用的,但不使用索引。

order by case when MyDate is null then 1 else 0 end, MyDate

就我而言,我需要表现。

 SELECT smoneCol1,someCol2  
 FROM someSch.someTab
 WHERE someCol2 = 2101 and ( someCol1 IS NULL ) 
  UNION   
 SELECT smoneCol1,someCol2
 FROM someSch.someTab
 WHERE someCol2 = 2101 and (  someCol1 IS NOT NULL)  

感谢RedFilter为排序空datetime字段的bug问题提供了出色的解决方案。

我使用SQL Server数据库为我的项目。

将datetime空值更改为“1”确实解决了对datetime数据类型列进行排序的问题。但是,如果列的数据类型不是datetime,则处理失败。

为了处理varchar列排序,我尝试使用'ZZZZZZZ',因为我知道列没有以'Z'开头的值。正如预期的那样。

在同一行中,我对int和其他数据类型使用max values +1来获得预期的排序。这也给了我所需要的结果。

然而,在数据库引擎本身中获得一些更简单的东西总是理想的,可以做一些像这样的事情:

Order by Col1 Asc Nulls Last, Col2 Asc Nulls First 

正如a_horis_with_no_name提供的答案中提到的。