今天同事出了个问题如下:
一个表t,有个日期列d。需要写SQL,输出日期d。排序要求:d大于当前日期的在小于的之前,距离当前日期越进的在远的之前 。
挺有意思,尝试写写。
现在日期一般都用long类型存储。这里做测试,为了方便测试数据用1-9代表日期,其中5为当前日期。
建表结构:
CREATE TABLE `t` (
`d` BIGINT(20) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
insert into `t` (`d`) values (1),(2),(3),(4),(5),(6),(7),(8),(9);
得到如下数据:
现在想得到的数据顺序为 6、7、8、9、4、3、2 、1
这里先报一下最后大神的方法,再次膜拜:
select d<5 as future, d from t order by future, abs(d-5)
诸位大神看到这里就可以结束了。
下面是我自己的思路,用于记录,见笑。到最后自己也只得出了下面sql。
用当前值与最大值比较,得出排序的临时字段z
SELECT a3.z,a3.d
FROM (
(
SELECT t1.m-d z, d
FROM t,(select max(d) m from t) t1
WHERE t.d > 5) UNION ALL
(
SELECT d-t1.m z, d
FROM t,(select max(d) m from t) t1
WHERE t.d < 5)
) a3
ORDER BY a3.z DESC
尽管很low,但还是要把一步步走过来的轨迹记录下。
1、sql语句默认正序排列,这个方法不能实现。
2、尝试增加临时变量用来记录顺序,还没想到怎么取合理的临时变量。
3、将上一步的sql语句简化
4、找到一个临时变量。对大于5(当前时间)的值,进行 最大值减去当前值 做临时变量。对小于5的值,进行 当前值减去最大值 做临时变量,合并后做临时变量倒序排列。
或许有更好的方法。欢迎留言。