Sql server 在同一列中对Asc和desc进行排序
我在一个表中有一个日期列,我想创建一个SELECT查询,该查询的结果顺序将是所有大于或等于今天日期的日期都是第一个,顺序应该是ASC,所有小于今天日期的日期都是第二个,顺序是DESC 顺序应如下所示: 注:Sql server 在同一列中对Asc和desc进行排序,sql-server,tsql,sql-order-by,Sql Server,Tsql,Sql Order By,我在一个表中有一个日期列,我想创建一个SELECT查询,该查询的结果顺序将是所有大于或等于今天日期的日期都是第一个,顺序应该是ASC,所有小于今天日期的日期都是第二个,顺序是DESC 顺序应如下所示: 注: 下表中的日期格式为YYYY-MM-DD 今天的日期是2021年2月8日 我的日期的数据类型是date 2021-02-08 2021-02-09 2021-05-18 2022-06-29 0然后是1 结束 ,日复一日 在这种方法中,我得到的结果顺序是: 2021-02-08 2021-02
date
2021-02-08
2021-02-09
2021-05-18
2022-06-29 0然后是1
结束
,日复一日
在这种方法中,我得到的结果顺序是:
2021-02-08
2021-02-09
2021-05-18
2022-06-29您需要条件排序:
SELECT *
FROM tablename
ORDER BY
CASE WHEN datecolumn >= CONVERT(DATE, GETDATE()) THEN 1 ELSE 2 END,
ABS(DATEDIFF(day, CONVERT(DATE, GETDATE()), datecolumn))
请参阅。
结果:
日期栏
2021-02-08
2021-02-09
2021-05-18
2022-06-29
2021-02-07
2021-02-06
2021-01-03
2020-12-06
2020-10-08
“我的日期格式为YYYY-MM-DD”日期和时间数据类型没有格式,它们是二进制值。如果您的数据以“格式”存储,则根据定义,它不是日期
,很可能是varchar
(一个主要的设计缺陷)。至于这个问题,你试过什么?看起来您只需要几个大小写表达式。我的意思是,在我在帖子中写的列表中,日期是以YYYY-MM-DD格式写的。(我将编辑帖子)谢谢,但你没有包括你的尝试。请这样做,并解释为什么它们不起作用。它起作用了,谢谢你优雅的解决方案!通过强制输入:select TN.*from TableName as TN cross apply(select DateDiff(day,Cast(GetDate()as Date),DateColumn)as Delta)as Diff(Delta)order by-(Sign(Delta)-1)/2,Abs(Delta)代码>。在符号
上做额外的修改是将当前日期放入排序的正确一半。
SELECT *
FROM tablename
ORDER BY
CASE WHEN datecolumn >= CONVERT(DATE, GETDATE()) THEN 1 ELSE 2 END,
ABS(DATEDIFF(day, CONVERT(DATE, GETDATE()), datecolumn))