【问题标题】:SQLite compare datesSQLite 比较日期
【发布时间】:2012-10-26 16:41:13
【问题描述】:

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

【问题讨论】:

  • 你能在SQLFiddle上展示一些样本吗?
  • 稍等。从文档中:“SQLite 没有为存储日期和/或时间预留存储类。”所以它不能是 DATE - 你的专栏到底是什么?
  • 这是一个 DATE.. 在我的创作脚本中,我的 sqlite-manager 也向我展示了一个 DATE 类型
  • @juergend : 在 sql fiddle 中它可以正常工作 oO

标签: sql sqlite date


【解决方案1】:

来自文档:

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 似乎将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'); 

【讨论】:

  • 我不比较字符串。我编辑了问题 -> 表结构。当我将 'Geburtsdatum' 转换为 DATE 或 DATETIME 时,没有显示结果。如果我只转换 'Between-Values' 结果是错误的。
  • 在 SQLite 中很有趣,哇日期很有趣。检查我的编辑。
【解决方案2】:

有人遇到了同样的问题并得到了解决。 (比较前使用 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')

--编辑--

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

【讨论】:

  • 这是一个日期,而不是一个日期时间,我尝试了这种方式并得到了一些奇怪的结果。
  • 奇怪的 /wi(ə)rd/ “暗示超自然的东西;不可思议”......是一个模糊的词。你到底看到了什么?您在表格中的值是什么样的?
  • 例如我得到一个类似日期的结果:'13.02.1990',那不是在 1993 年和 2000 年之间,对吧? :)
  • 因为您正在比较字符串。使用 datetime 函数转换为日期,然后进行比较。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    相关资源
    最近更新 更多