我有这个SQL语句:
SELECT Geburtsdatum FROM Kunde
WHERE Geburtsdatum BETWEEN '1993-01-01' AND '2000-01-01'
但是我得到了一些奇怪的结果,比如:2.02.1990
'Geburtsdatum'是DATE
有任何建议或解决方案吗?
我的表结构:
CREATE TABLE Kunde (
Kunde_ID INTEGER NOT NULL ,
Card INTEGER ,
Vorname VARCHAR(255) NOT NULL ,
Nachname VARCHAR(255) NOT NULL ,
Ort VARCHAR(255) NOT NULL ,
Strasse VARCHAR(255) NOT NULL ,
Postleitzahl VARCHAR(10) NOT NULL ,
Mail VARCHAR(255) ,
Telefonnummer VARCHAR(255) ,
Geburtsdatum DATE NOT NULL ,
Beitrittsdatum DATE NOT NULL ,
Geschlecht INTEGER NOT NULL ,
Land VARCHAR(255) NOT NULL DEFAULT 'Österreich' ,
Bankname VARCHAR(255) ,
Bankleitzahl VARCHAR(255) ,
Kontonummer VARCHAR(255) ,
GroupID INTEGER NOT NULL ,
Besucher INTEGER ,
Access BOOLEAN ,
image BLOB NULL ,
writeDate DATE ,
drinkAbo BOOLEAN ,
PRIMARY KEY (Kunde_ID) )
答案 0 :(得分:18)
来自文档:
SQLite没有预留用于存储日期和/或时间的存储类。
因此,您的列未完全存储为日期。进一步阅读,我们了解到指定为DATE
的列实际上使用关联性规则5存储为NUMERIC
。
回到1.2节:
真实的朱利安日数,即公元前4714年11月24日格林威治中午以来的天数。根据公历格里高利历。
好。所以让我们试试:
SELECT Geburtsdatum FROM Kunde
WHERE Geburtsdatum
BETWEEN julianday('1993-01-01') AND julianday('2000-01-01');
奇怪的是,SQL Fiddle似乎将DATE
存储为字符串,而上述操作无效。在这种情况下,应该:
SELECT Geburtsdatum FROM Kunde
WHERE date(Geburtsdatum)
BETWEEN date('1993-01-01') AND date('2000-01-01');
此外,在您的情况下,您似乎返回了一些奇怪的(读取:本地化)格式。我想知道它是否真的是你的情况下的字符串,只是使用不同的格式。你可以尝试:
SELECT Geburtsdatum FROM Kunde
WHERE strftime('%d.%m.%Y', Geburtsdatum)
BETWEEN date('1993-01-01') AND date('2000-01-01');
答案 1 :(得分:4)
有人遇到了同样的问题并得到了解决。 (比较前使用datetime函数)
<强>摘录:强> 在日期时间函数之后,字符串格式为YYYY-MM-DD HH:mm:ss我取得了如下良好的结果
select *
from table_1
where mydate >= Datetime('2009-11-13 00:00:00')
and mydate <= Datetime('2009-11-15 00:00:00')
- 编辑 -
你基本上是在比较字符串。这就是出乎意料的行为。在比较之前使用函数转换为datetime,它应该可以工作。
答案 2 :(得分:1)
为了能够比较日期,您必须将其存储在SQLite's supported date formats之一,例如JJJJ-MM-TT
字符串。您的日期将以本地化日期格式存储为字符串,而SQLite无法识别这些格式。
如果最重要的字段不在字符串的开头,则字符串比较将不适用于日期 使用表格中的当前值,您将无法进行任何比较。