SQLite比较日期

时间:2012-10-26 16:41:13

标签: sql sqlite date

我有这个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) )

3 个答案:

答案 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函数)

请参阅SQLite DateTime comparison

<强>摘录: 在日期时间函数之后,字符串格式为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无法识别这些格式。

如果最重要的字段不在字符串的开头,则字符串比较将不适用于日期 使用表格中的当前值,您将无法进行任何比较。