2

今日は2月3日だとしましょう。

そして私はテーブルを持っています:

CREATE TABLE devotion
(
  id serial NOT NULL,
  date timestamp without time zone
}

そして私は4つのレコードを持っています:

id date
1  2013-01-01
2  2013-02-02
3  2013-03-03
4  2013-04-04

次の順序ですべてのレコードを返すselectクエリを作成したいと思います(日付順に並べられていますが、次の日付が最初で、渡された日付がリストの最後に追加されます):

id date
3  2013-03-03 (upcoming dates first)
4  2013-04-04
1  2013-01-01 (passed dates appended to the end of the list)
2  2013-02-02

すべてのレコードは同じ年です。実際、年は重要ではなく、日と月だけが重要です。より良い構造を提案できれば、大歓迎です。

4

4 に答える 4

4

order by case when date1 > now() then 0 else 1 end case, date1

3,4,1,2の順番になります

于 2013-02-01T16:30:08.100 に答える
2

より簡単:

ORDER BY (date1 < now()), date1

式のブール値で並べ替えることができます(date1 < now())
FALSEソート前TRUEソート前NULL.

于 2013-02-01T17:17:19.450 に答える
1

ここに別の解決策があります。もちろん、上記の回答で十分です。Now()今日が 2 月 3 日であると仮定することはできませんFeb 2nd。そこで、デモデータを使用しまし2013-02-01た。そして、この答えは主にあなたのID. ID が連続していると言うことは、日付もそうです。このロジックの危険な部分については、誰でも自由にコメントできます..

MYSQL デモ

select id, `date`,
case when `date` > Date_Format(Now(),'%Y-%m-%d')
then id-3
else id+2 end as x
from demo
order by x asc
;

| ID |                            DATE | X |
--------------------------------------------
|  3 |    March, 03 2013 00:00:00+0000 | 0 |
|  4 |    April, 04 2013 00:00:00+0000 | 1 |
|  1 |  January, 01 2013 00:00:00+0000 | 3 |
|  2 | February, 01 2013 00:00:00+0000 | 4 |
于 2013-02-01T17:01:43.940 に答える
0

MySQL を使用している場合は、 を使用するだけですRIGHTが、以下は psql で機能するはずです。

SELECT * FROM devotion ORDER BY substring(to_char( date, 'YYYY-MM-DD') from char_length(to_char( date, 'YYYY-MM-DD')) - 5)
于 2013-02-01T16:31:59.563 に答える