SQL selecciona el order de consulta por día y mes

Vamos a fingir que hoy es el 3 de febrero.

Y tengo una table:

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

Y tengo 4 loggings:

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

Quiero crear una consulta de selección que devuelva todos los loggings en el siguiente order (orderados por date, pero las dates próximas primero, dates pasadas anexadas al final de la list):

 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 

Todos los loggings tienen el mismo año. De hecho, el año no es importante, solo el día y el mes lo son. Si puedes sugerir una mejor estructura, eres bienvenido.

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

dará order de 3,4,1,2

Simpler:

 ORDER BY (date1 < now()), date1 

Puede simplemente orderar por el valor boolean de la expresión (date1 < now()) .
FALSE ordera antes de TRUE ordera antes de NULL .

Aquí hay otra solución. Por supuesto que la respuesta es lo suficientemente buena. No puede suponer que hoy es el 3 de febrero ya que estamos tomando Now() que representan Feb 2nd . Así que utilicé datos de demostración 2013-02-01 . Y esta respuesta depende principalmente de tu ID . Decir que la ID es secuencial, así es la date. Cualquiera es libre de comentar sobre la parte dudosa de esta lógica

DEMO 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 | 

Si estuvieras en MySQL, diría que simplemente usa el RIGHT , pero el siguiente debería funcionar en psql:

 SELECT * FROM devotion ORDER BY substring(to_char( date, 'YYYY-MM-DD') from char_length(to_char( date, 'YYYY-MM-DD')) - 5)