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

3 回答 3

18

从文档中:

SQLite 没有为存储日期和/或时间预留存储类。

因此,您的列并未完全存储为日期。进一步阅读,我们了解到指定为DATE的列实际上是NUMERIC使用关联规则 5 存储的。

回到第 1.2 节:

REAL 作为儒略日数字,根据预测的公历,自公元前 4714 年 11 月 24 日格林威治中午以来的天数。

好的。所以让我们试试:

SELECT Geburtsdatum FROM Kunde
WHERE Geburtsdatum 
    BETWEEN julianday('1993-01-01') AND julianday('2000-01-01'); 

奇怪的是,SQL Fiddle似乎将DATEs 存储为字符串,而上述方法不起作用。在这种情况下,应该:

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'); 
于 2012-10-26T16:51:48.793 回答
4

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

请参阅SQLite 日期时间比较

摘录: 遵循 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')

- 编辑 -

您基本上是在比较字符串。这就是意外行为的原因。在比较之前使用该函数转换为日期时间,它应该可以工作。

于 2012-10-26T16:44:48.180 回答
2

为了能够比较日期,您必须将它们存储为SQLite 支持的日期格式之一,例如JJJJ-MM-TT字符串。您的日期以 SQLite 无法识别的本地化日期格式存储为字符串。

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

于 2012-10-26T18:27:03.903 回答