需求:假如當前時間是大于starttime且小于endtime的則按starttime倒序排列顯示一條記錄;假如當前時間小于starttime且小于endtime則按starttime正序排列顯示一條記錄。要在一次sql查詢中完成。
====這個是論壇里面的,人家給出答案了,我只是學習的.算做個學習筆記,也許以后會用到。怕腦子壞了
?
SELECT FROM_UNIXTIME( starttime, '%Y年%m月%d日 %H時%i分%s秒' ) AS starttime, FROM_UNIXTIME( endtime, '%Y年%m月%d日 %H時%i分%s秒' ) , if( starttime < UNIX_TIMESTAMP( ) , starttime - UNIX_TIMESTAMP( ) , (
starttime - UNIX_TIMESTAMP( ) ) +20000000
) AS t
FROM test
WHERE endtime > UNIX_TIMESTAMP( )
ORDER BY t ASC
LIMIT 0 , 30
if()函數就是實現這個的關鍵。
IF(expr1,expr2,expr3)?
如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),則 IF()的返回值為expr2; 否則返回值則為 expr3。IF() 的返回值為數字值或字符串值,具體情況視其所在語境而定。
為true
執行 starttime - UNIX_TIMESTAMP() 按得到的值asc排序這樣就得到了“距離現在最近的starttime,也就是剛剛已經開始的”記錄列表
為false
執行 (starttime - UNIX_TIMESTAMP())+20000000?
starttime - UNIX_TIMESTAMP()這樣得到了 “starttime距離現在最近的,也就是馬上將要到來的starttime”記錄列表;由于 “未開始記錄的”starttime - UNIX_TIMESTAMP() 得到的值可能小于“已開始記錄的”starttime - UNIX_TIMESTAMP() 的值,這種情況下排序就混亂了,所以要加上一個很大的值20000000避免這種情況,這樣就能保證未開始記錄的starttime永遠大于已開始記錄的starttime值,這樣未開始的值記錄排在了已開始記錄之后了。
?