Получите 5 ближайших дат сегодня, используя SQLite - PullRequest
0 голосов
/ 12 января 2012

У меня есть база данных / таблица в SQLITE, использующая следующую структуру

CREATE TABLE milestones ( 
    ID       INT( 10 )        NOT NULL,
    Title    VARCHAR( 50 )    DEFAULT NULL,
    mYear    INT( 11 )        NOT NULL,
    mMonth   INT( 11 )        DEFAULT NULL,
    mDay     INT( 11 )    DEFAULT NULL,
    mText    VARCHAR( 2000 )  NOT NULL,
    Theme1   VARCHAR( 50 )    DEFAULT NULL,
    Theme2   VARCHAR( 50 )    DEFAULT NULL,
    ImageURL VARCHAR( 50 )    DEFAULT NULL,
    PRIMARY KEY ( ID ) 
);

Я использую следующий запрос, чтобы получить 5 ближайших дат по отношению к сегодняшней дате.

SELECT dtable.ID, dtable.Date 
FROM(SELECT ID, date(mYear||'-'||mMonth||'-'||mDay) as Date 
FROM milestones
WHERE mMonth IS NOT NULL AND mDay IS NOT NULL AND mMonth ="+varMonth+")AS dtable
ORDER BY ABS("+varDay+"-date(dtable.Date, '%d'))
LIMIT 5;

Проблемы с использованием этого запроса в том, что я получаю только записи с форматом даты гггг-мм-дд. Если есть какая-либо запись с 1-значным месяцем или днем ​​(формат гггг-м-д или гггг-мм-д или гггг-м-дд), она не отображается в результате.

Как решить эту проблему, не меняя тип данных mMonth или mDay?

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Если вы хотите дополнить строку нулями, чтобы убедиться, что она имеет ширину 2 символа, вы можете использовать этот простой подвох с несколькими встроенными функциями SQLite:

SUBSTR('00'||month,-2)
1 голос
/ 12 января 2012

Я думаю, что потенциальная причина, по которой вы не получаете совпадения для однозначных месяцев, заключается в том, что ваш + varMonth + отформатирован, например, как "04". Скорее всего, вы рассматриваете их как строки, и происходит неявное (string) int приведение, поэтому "4" = "04" не совпадает. Не уверен, почему это также повлияет на + varDay +, хотя, поскольку я предполагаю, что для вычитания его приведено обратно к int, происходит нечто вроде (int) ((string) int).

Не могли бы вы исключить это?

Также я вижу недостаток в том, что «ближайшие 5 дат» ограничены текущим месяцем, поэтому, если сегодня был первый / последний день месяца, вы все равно получили бы результаты только в текущем месяце.

Попробуйте этот запрос:

SELECT dtable.ID, dtable.Date  
FROM (SELECT ID, date(mYear||'-'||mMonth||'-'||mDay) as Date  
FROM milestones WHERE mMonth IS NOT NULL AND mDay IS NOT NULL) AS dtable 
ORDER BY ABS(date("+varYear+"||'-'||"+varMonth+"||'-'||"+varDay+") - dtable.Date) ASC  
LIMIT 5;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...