4

我将我的日期存储为格式为“dd-mm-yyyy”的字符串。现在我想做一个这样的比较:

SELECT strftime('%d/%m/%Y', myDate) as myDate
FROM myTable
WHERE myDate>='01/07/2013' and myDate<='24/07/2013'

但我什么也得不到。这个查询有什么问题?

这不是一个重复的问题。我将所有内容都存储为字符串,而不是日期或日期时间。我试图在具有日期格式的字符串之间进行比较。因此,否决票是不公平的。

4

2 回答 2

8

在当前设置下,您无法让查询像这样工作:

我将日期存储为字符串,所以我想通过使用 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'

这将在进行比较之前将字符串分开,以正确的顺序将它们重新组合在一起。还要注意那里最后两个日期的格式。

于 2013-07-06T22:12:26.997 回答
0

你试过这个:

SELECT strftime('%d/%m/%Y', myDate) as myDate
FROM myTable
WHERE myDate between date('01/07/2013') and date('24/07/2013');
于 2013-07-06T21:56:48.840 回答