使用SQLite获取最近的5个日期

时间:2012-01-12 16:59:04

标签: javascript html sql sqlite

我在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;

使用此查询的问题是我只获取日期格式为yyyy-mm-dd的记录。 如果有任何月份或日期为1位数的记录(格式为yyyy-m-d或yyyy-mm-d或yyyy-m-dd),则不会在结果中显示。

如何在不更改mMonth或mDay数据类型的情况下解决此问题?

2 个答案:

答案 0 :(得分:2)

如果你想用零填充一个字符串以确保它是2-char宽,你可以使用这个简单的脏技巧和几个SQLite内置的可用函数:

SUBSTR('00'||month,-2)

答案 1 :(得分:1)

我认为你没有获得单个数字月份匹配的潜在原因是因为你的+ varMonth +本身被格式化为“04”。您可能将它们视为字符串,并且发生了隐式(字符串)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;