SQLite比较日期

14

我有这个 SQL 语句:

SELECT Geburtsdatum FROM Kunde
WHERE Geburtsdatum BETWEEN '1993-01-01' AND '2000-01-01'

但我得到了一些奇怪的结果,比如:2.02.1990

'Geburtsdatum' 是一个日期

有什么建议或解决方案吗?

我的表结构:

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) )

1
你能在SQLFiddle上展示一些样例吗? - juergen d
1
等一下。从文档中可以看到:“SQLite没有为存储日期和/或时间保留存储类别。” 所以它不能是一个DATE - 你的列实际上是什么? - lc.
这是一个日期...在我的创作脚本中,同时我的SQLite管理器显示它是一个DATE类型。 - Christian 'fuzi' Orgler
@juergend:在 SQL Fiddle 上它可以工作,哦哦。 - Christian 'fuzi' Orgler
3个回答

18

从文档中得知:

SQLite 没有为存储日期和/或时间分配专门的存储类别。

因此,您的列并非以日期形式存储。进一步阅读发现,指定为 DATE 的列实际上使用亲和性规则 5 以 NUMERIC 形式进行存储。

回到第 1.2 节:

REAL 用作朱利安日数,即格林威治时间 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'); 

我不比较字符串.. 我编辑了问题 -> 表结构。 当我将 'Geburtsdatum' 转换为 DATE 或 DATETIME 时,没有显示结果。如果我只转换 'Between-Values',结果是错误的。 - Christian 'fuzi' Orgler
有趣的是,在SQLite中日期很有趣。检查我的编辑。 - lc.

4

有人遇到了同样的问题并解决了它。(在比较之前使用datetime函数)

请参见SQLite DateTime comparison

摘录:使用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函数进行转换,它应该可以正常工作。


这是一个日期,而不是日期时间,我尝试了这种方式并且得到了一些奇怪的结果。 - Christian 'fuzi' Orgler
奇怪 /wi(ə)rd/ 是一个含糊不清的词,意味着某些超自然或神秘的东西。你具体看到了什么?你在表格中的数值是什么样的? - rizalp1
我得到了一个结果,例如日期:'13.02.1990',这不在1993年和2000年之间,对吧? :) - Christian 'fuzi' Orgler
因为你正在比较字符串。使用datetime函数将其转换为日期,然后进行比较。 - rizalp1

2
要进行日期比较,必须将其存储在其中一种SQLite支持的日期格式中,例如JJJJ-MM-TT字符串。您的日期以本地化日期格式的字符串形式存储,而此格式不被SQLite识别。
如果最重要的字段不在字符串的开头,则无法使用字符串比较来进行日期比较。 根据您表格中当前的值,您将无法进行任何比较。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接