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