我将日期作为字符串存储,格式为'dd-mm-yyyy'。现在我想做这样的比较:
SELECT strftime('%d/%m/%Y', myDate) as myDate
FROM myTable
WHERE myDate>='01/07/2013' and myDate<='24/07/2013'
但我一无所获。这个查询有什么问题?
这不是一个重复的问题。我将所有内容存储为String,而不是DATE或DATETIME。我试图用日期格式比较字符串。因此投票不公平。
答案 0 :(得分:7)
您无法使用当前设置使查询正常工作:
我将日期存储为字符串,所以我想使用strftime我可以得到我想要的东西。或者我错了吗?
基本上:你错了!
这里的问题是,那样格式化的字符串将无法以您想要的方式排序。
具体做法是:
myDate>='01/07/2013' and myDate<='24/07/2013'
此处,任何一年中任何月份的第一个和第24个之间的任何日期都将与此匹配。 IE浏览器。这将匹配:“02/01/1900”,这将是:“02/12/2099”。
原因是字符串比较是字母数字,而不是数字(或日期)。 “02”大于“01”且小于“24”,其余的只是多余的。
将日期格式化为字符串的“逻辑”方式是从最重要的值开始,向下工作,即。这种格式:“yyyy / mm / dd”,而不是相反,但真正的逻辑方式来存储日期,是将其存储为日期,而不是字符串。< / p>
使用字符串的唯一方法是将每个字符串转换为日期并使用该字符串,但最佳方式是修复您的架构。
如果绝对无法更改您当前的架构,可以使用以下方法,但我不建议:
where (substr(myDate, 7, 4) || '-' || substr(myDate, 4, 2) || '-' || substr(myDate, 1, 2)) between '2013-07-01' and '2013-07-24'
在进行比较之前,这将拆分字符串,以正确的顺序将它们重新组合在一起。另请注意那里最后两个日期的格式。
答案 1 :(得分:0)
你试过这个:
SELECT strftime('%d/%m/%Y', myDate) as myDate
FROM myTable
WHERE myDate between date('01/07/2013') and date('24/07/2013');