2

私の日付列は整数型です:

myDate.getTime() //long saved in db

今後の誕生日を最適に並べ替える方法を調査しているときに、次のことがわかりました。 現在の日付に基づいて今後の誕生日を並べ替えるMySQLクエリ

ソリューションをSQLite構文に変換しようとしましたが、うまくいきませんでした。誰かが私を正しい方向に押したいですか?

たとえば、タイムスタンプの月を取得することさえできません。

strftime('%m', birthday) //unexpected value (dec = 1, jan = 1, jan = 6)
strftime('%m', 'now') // as expected (mar = 3)

助けていただければ幸いです。

更新 わかりました、今私は本当に混乱を作成しました:

cur = db.rawQuery("SELECT "
                        + "(strftime('%Y','now') - strftime('%Y',datetime(("+BIRTHDATE+"/1000), 'unixepoch', 'localtime'))) AS age,"
                        + "date((" + BIRTHDATE + "/1000),'+' || age || ' year') AS currbirthday,"
                        + "date((" + BIRTHDATE + "/1000),'+' || age+1 || ' year') AS nextbirthday"
                    + " FROM " + TABLE
                    + " ORDER BY CASE" 
                        + " WHEN currbirthday < date('now') THEN nextbirthday"
                        + " ELSE  currbirthday" 
                    + " END", null); 

エラー:「そのような列の経過時間はありません」

さて、「年齢」を計算する式全体を連結内に入れてみましたが、結果は奇妙です(年齢は正しい値を格納します):

Log.d("bdate", contact.getFirstname() + ": currbday=" + cur.getString(1));
Log.d("bdate", contact.getFirstname() + ": nextbday=" + cur.getString(2));

サマンサ:currbday = -5705--6--29

サマンサ:nextbday = -5704--6--29

助言がありますか?

4

2 に答える 2

1

誰かが不思議に思う場合に備えて、これは私の解決策です:

cur = db.rawQuery("SELECT "
                        + "date(strftime('%Y', 'now','localtime')||strftime('-%m-%d', datetime(("+BIRTHDATE+"/1000), 'unixepoch', 'localtime'))) as currbirthday,"
                        + "date(strftime('%Y', 'now','localtime')||strftime('-%m-%d', datetime(("+BIRTHDATE+"/1000), 'unixepoch', 'localtime')),'+1 year') as nextbirthday"
                    + " FROM " + TABLE
                    + " ORDER BY CASE" 
                        + " WHEN currbirthday < date('now') THEN nextbirthday"
                        + " ELSE  currbirthday" 
                    + " END", null); 
于 2013-04-02T09:41:03.810 に答える
0

私は別のアプローチで解決策を見つけました。それは私が信じるどんなコーナーケースでも正しく機能します。その年の日に基づいて残りの日数を計算し、誕生日が翌年になる場合は結果を修正します。

SELECT
    *, 
    strftime('%j', birthday) - strftime('%j', 'now') AS days_remaining
FROM
    person
WHERE :n_days >= CASE
    WHEN days_remaining >= 0 THEN days_remaining
    ELSE days_remaining + strftime('%j', strftime('%Y-12-31', 'now'))
    END
;
于 2019-04-07T10:39:08.597 に答える