SQLite - 按下一个即将到来的日期排序(忽略年份)

时间:2014-10-10 12:51:57

标签: android sql sqlite date

我有一张人的桌子,我想在下一个即将到来的生日(无视年份)订购它们。 我使用了这个答案中描述的方法:

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

OR

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)

我可以对代码做些什么更改呢?

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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')表示为YYYY-MM-DD,这就是为什么我们将Substr(birthdate,4,2)Substr(Date('now',6,2)进行比较的原因。 我们必须在其他select语句中包含select语句,否则我们必须将ORDER BY放在整个语句的末尾,这当然是你不想要的。

相关问题