sql?where

伟洪winni 2015-11-27 10:09:55
查出大于或等于当前时间的event_start_date Ace
查出 小于 当前时间的event_start_date Desc
如何将这两个条件用一条sql来表示
...全文
133 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2015-11-27
  • 打赏
  • 举报
回复
所以这个需求通过日期差排序比较直观 to_days 是求从 0 年起的天数,于是 to_days(event_start_date)-to_days(now()) 就是两个日期间相差的天数了 order by to_days(event_start_date)-to_days(now())>=0 desc, abs(to_days(event_start_date)-to_days(now())) 中 to_days(event_start_date)-to_days(now())>=0 desc 表示将天数差大于等于 0 的排在前面 abs(to_days(event_start_date)-to_days(now())) 表示将天数差的绝对值升序排列(也就是日期降序了)
misaka去年夏天 2015-11-27
  • 打赏
  • 举报
回复
引用 13 楼 xuzuning 的回复:
SELECT *FROM table where event_start_date>=CURDATE() ORDER BY event_start_date ASC 这个查询本身没有错 但是放在 union 中就错了,因为有 order by 排序一下本身没问题,但作为计算表出现 select * from (SELECT *FROM table where event_start_date>=CURDATE() ORDER BY event_start_date ASC) t
明白了,学习了!
xuzuning 2015-11-27
  • 打赏
  • 举报
回复
SELECT *FROM table where event_start_date>=CURDATE() ORDER BY event_start_date ASC 这个查询本身没有错 但是放在 union 中就错了,因为有 order by 排序一下本身没问题,但作为计算表出现 select * from (SELECT *FROM table where event_start_date>=CURDATE() ORDER BY event_start_date ASC) t
misaka去年夏天 2015-11-27
  • 打赏
  • 举报
回复
在整个SQL语句之后加上order排序一下,是不是可以消除2楼的错误。

((SELECT *FROM table where event_start_date>=CURDATE() ORDER BY event_start_date ASC) UNION (SELECT *FROM table WHERE event_start_date<CURDATE() ORDER BY event_start_date DESC)) ORDER BY event_start_date;
伟洪winni 2015-11-27
  • 打赏
  • 举报
回复
秒不比较?
misaka去年夏天 2015-11-27
  • 打赏
  • 举报
回复
2楼写的是对的。。。今天真是有点晕
引用 6 楼 xuzuning 的回复:
这个效果?
event_start_date 
2015-11-30 
2015-12-17 
2015-11-10 
2015-01-27 
2014-11-24 
用联合
select * from
 (select * from tbl_name where event_start_date >= now() order by event_start_date) t1
union
select * from
 (select * from tbl_name where event_start_date < now() order by event_start_date desc) t2
用优先排序
select *
 from T
 order by
  to_days(event_start_date)-to_days(now())>=0 desc,
  abs(to_days(event_start_date)-to_days(now())) 
版主的这个答案是正确的。。我没有注意到union时order的问题
xuzuning 2015-11-27
  • 打赏
  • 举报
回复
二楼是错的! 联合中的 order 只能出现在最后
伟洪winni 2015-11-27
  • 打赏
  • 举报
回复
引用 5 楼 misakaqunianxiatian 的回复:
二楼写的是对的……今天真晕乎…
分开没问题 合在一起时 2015-12-17 会在 2015-11-30 之上
xuzuning 2015-11-27
  • 打赏
  • 举报
回复
这个效果?
event_start_date 
2015-11-30 
2015-12-17 
2015-11-10 
2015-01-27 
2014-11-24 
用联合
select * from
 (select * from tbl_name where event_start_date >= now() order by event_start_date) t1
union
select * from
 (select * from tbl_name where event_start_date < now() order by event_start_date desc) t2
用优先排序
select *
 from T
 order by
  to_days(event_start_date)-to_days(now())>=0 desc,
  abs(to_days(event_start_date)-to_days(now())) 
「已注销」 2015-11-27
  • 打赏
  • 举报
回复
引用 5 楼 misakaqunianxiatian 的回复:
二楼写的是对的……今天真晕乎…
确实晕了,二楼正确
伟洪winni 2015-11-27
  • 打赏
  • 举报
回复
misaka去年夏天 2015-11-27
  • 打赏
  • 举报
回复
二楼写的是对的……今天真晕乎…
misaka去年夏天 2015-11-27
  • 打赏
  • 举报
回复
我脑残了,刚才写的有问题。还是等楼下回答吧
misaka去年夏天 2015-11-27
  • 打赏
  • 举报
回复
刚才写的有有误:
(SELECT *FROM table where event_start_date>=CURDATE() ORDER BY event_start_date ASC) UNION (SELECT *FROM table WHERE event_start_date<CURDATE() ORDER BY event_start_date DESC);
misaka去年夏天 2015-11-27
  • 打赏
  • 举报
回复
$date = date('Y-m-d');
$sql = "(SELECT *FROM table where event_start_date>=" . $date .  "ASC) UNION (SELECT *FROM table where event_start_date<" . $date . "DESC)";

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧