Sql server 在同一列中对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

我在一个表中有一个日期列,我想创建一个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-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))