我有一个包含“ActionDate”列的表,它有两种类型的日期:
我需要对数据进行排序,使得实际日期应该按升序排列,并且应该遵循常量值。
数据样本:
1)当前状态:
ActionDate
2014-01-03
2014-01-01
2014-01-02
1980-01-01
2014-01-04
2014-01-05
1980-01-01
2)期望的状态:
ActionDate
2014-01-01
2014-01-02
2014-01-03
2014-01-04
2014-01-05
1980-01-01
1980-01-01
答案 0 :(得分:6)
使用CASE
语句创建订单
SELECT ActionDate
FROM [Your_Table]
ORDER BY CASE WHEN ActionDate = '01-01-1980' THEN 1 ELSE 0 END, ActionDate
CASE
语句检查日期,当它是您的参考日期时,它指定值1.当在OREDER BY
中使用时,它表示标记为0的行将在标记为1的行之前。
ORDER BY
的第二部分使用自然日期排序从最旧到最新排序。
SQL Fiddle,其中包含排序顺序字段,可帮助您查看正在发生的事情。
答案 1 :(得分:0)
SELECT * , 'OrderDate' = CASE ActionDate
WHEN '01-01-1980' THEN 2
ELSE 1
END
FROM YourTable
ORDER BY OrderDate, data
在我的解决方案中,我创建了一个OrderDate列,其值为1或2,1对于所有实际数据为1,对于&01; 01-01-1980'然后你可以在该列之后和数据列之后对它们进行排序。
答案 2 :(得分:-1)
这样的事可能会这样做:
SELECT ActionDate
FROM dbo.MyTable
WHERE ActionDate <> '01/01/1980'
ORDER BY ActionDate
UNION ALL
SELECT ActionDate
FROM dbo.MyTable
WHERE ActionDate = '01/01/1980'
答案 3 :(得分:-1)
由于1980-01-01是时间戳起始值,我认为您的日期会自动生成,以存储今天的日期&#39;当行动发生时,换句话说,没有低于1980-01-01的日期,在这种情况下,一个简单的订单可以完成任务(而且它的速度要快得多)
SELECT ActionDate
FROM [Your_Table]
ORDER BY ActionDate DESC