我在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数据类型的情况下解决此问题?
答案 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;