您的位置:首页 > 数据库

一个表t,有个日期列d。需要写SQL,输出日期d。排序要求:d大于当前日期的在小于的之前,距离当前日期越进的在远的之前 。

2015-10-23 16:27 471 查看
今天同事出了个问题如下:

一个表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的值,进行 当前值减去最大值 做临时变量,合并后做临时变量倒序排列。



或许有更好的方法。欢迎留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: