2014-10-10 3 views
0

У меня есть таблица лиц, и я хочу заказать их к следующему предстоящему дню рождения (без учета года). Я использовал метод, описанный в этом ответе:SQLite - упорядочить по следующей предстоящей дате (игнорировать год)

https://stackoverflow.com/a/20522025/2934340

ИЛИ

SQL-код:

SELECT * 
FROM _table 
ORDER BY SUBSTR(DATE('NOW'), 6)>SUBSTR(birthdate, 6), SUBSTR(birthdate, 6); 

Проблема заключается в том, что я использую другой формат даты. В ответе выше формат даты - mm-dd, я хочу использовать dd-mm. Теперь мои даты сортировать так:

17-10-1974 
03-10-1979 
29-02-1980 
20-10-1993 

Я хочу, чтобы сортировать так:

17-10-1974 
20-10-1993 
29-02-1980 
03-10-1979 (Because we are at 10-10-2014/past this date) 

Какие изменения я могу сделать, чтобы мой код делать этого достичь?

+0

Это не один из поддерживаемых форматов [дата] (HTTP: // WWW. sqlite.org/lang_datefunc.html). –

+0

Что это значит? @CL. – themanwithballs

ответ

1

Простой способ архивировать это, было бы переключение месяца и дня с функцией SUBSTR():

SELECT * 
FROM _table 
ORDER BY SUBSTR(DATE('NOW'), 6)>(SUBSTR(birthdate, 4, 3) || SUBSTR (birthdate, 1, 2)), (SUBSTR(birthdate, 4, 3) || SUBSTR (birthdate, 1, 2)); 
+0

Это решило. Большое спасибо, сэр! – themanwithballs

0

Только быстрое решение я мог думать, заключается в следующем:

SELECT * 
FROM (SELECT * 
     FROM _table 
     WHERE (Substr(birthdate, 4, 2) = Substr(Date('now'), 6, 2) 
       AND Substr(birthdate, 1, 2) > Substr(Date('now'), 9, 2)) 
       OR (Substr(birthdate, 4, 2) != Substr(Date('now'), 6, 2)) 
     ORDER BY Substr(birthdate, 4, 2), 
        Substr(birthdate, 1, 2)) 
UNION ALL 
SELECT * 
FROM (SELECT * 
     FROM _table 
     WHERE Substr(birthdate, 4, 2) = Substr(Date('now'), 6, 2) 
       AND Substr(birthdate, 1, 2) < Substr(Date('now'), 9, 2) 
     ORDER BY Substr(birthdate, 1, 2)); 

Давайте предположим, что сегодня 21-02, первый оператор вернет все дни рождения от 22-02 до 31-01. Затем второй оператор вернет дни рождения, которые находятся с 01-02 до 20-02. Date('now') представлен как ГГГГ-ММ-ДД, поэтому мы сравниваем Substr(birthdate,4,2) с Substr(Date('now',6,2) для сравнения месяца. Мы должны были включать выражения выбора внутри других операторов select, потому что в противном случае мы должны поместить ORDER BY в конец всего заявления, и это, конечно, то, чего вы не хотите.