【问题标题】:SQLite date string comparison. SAME FORMAT not workingSQLite 日期字符串比较。相同的格式不起作用
【发布时间】:2017-02-19 21:05:42
【问题描述】:

请帮忙!这一直让我发疯。是的,我查看了几十个 Stack Overflow 类似问题的答案,他们都说“您的日期应该采用一致的可接受格式”。

所有我的 SQLite 日期都以以下字符串格式存储:

'yyyy-MM-dd HH:mm:ss'

我正在尝试进行日期比较,但没有任何效果。例如:

SELECT         transactiondate
FROM           transactions 
WHERE          transactiondate >= '2010-02-19 00:00:00'

不起作用..我返回 0 条记录。

即使当我在没有 WHERE 子句的情况下运行它时,我也会得到返回的日期字符串,例如:

'2017-02-25 00:00:00'

其实就是在做:

SELECT         transactiondate
FROM           transactions 
WHERE          '2017-02-25 00:00:00' >= '2010-02-19 00:00:00'

确实有效,即它以原始形式成功比较日期,但在引用表列值时却没有。

拜托..我做错了吗?

此外,我已经尝试了 SQL 中 datetime(...)、date(...) 的所有排列,但均无济于事。我也尝试过使用 ... BETWEEN ... AND ...,但没有帮助。

如果有人能解决这个问题,请提前感谢。

【问题讨论】:

  • 从交易中选择不同的长度(交易日期);检查不可见的字符。检查空格是否真的是一个选项卡。我自己将 sqlite 用于此类日期时间的事情,尽管我的格式是 yyyymmdd-hh:mi:ss。
  • 嗨,我得到 1 个结果:length(transactiondate) 21
  • 这与 19 不同。隐形字符理论变得更加强大。是换行符吗?额外的空间?也许可以用 UPDATE 和 SUBSTR 修复数据。
  • 但是“'2010-02-19 00:00:00'”的长度是21,包括单引号
  • 作为诊断,尝试使用date 函数将存储在表中的一些值转换为“内部”表示,然后再返回“看看会发生什么”?

标签: string sqlite date format comparison


【解决方案1】:

您的数据中包含前面和结尾的 '。在列交易日期。

那么您还需要在 WHERE 过滤器中包含 ' 字符。在 SQLite 中有两种方法:

select * from transactions where transactiondate >= "'2010-02-19 00:00:00'";
select * from transactions where transactiondate >= '''2010-02-19 00:00:00''';

但是,我建议您改为清理数据:

update transactions
set transactiondate=substr(transactiondate,2,length(transactiondate)-2)
where transactiondate like "'%'";

现在您可以使用原来的 WHERE 而无需额外的 ' 字符。

【讨论】:

  • 哦,我明白了,我没有意识到单引号是数据的一部分,我认为这表明它是一个字符串值!非常感谢,+1 :) 我使用 T-SQL 和 VB Web 服务工作了一年,因此我的假设是(这种比较以前总是有效的)。
【解决方案2】:

好的,这不是答案。但是在 SO 中,你不能在评论中做这种事情。

我无法复制您的情况。代码,尤其是 SELECT,在 Python 中运行良好。

>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> cur = conn.cursor()
>>> cur.execute('CREATE TABLE transactions (transactionsdate string)')
<sqlite3.Cursor object at 0x000000000531CCE0>
>>> cur.execute('''INSERT INTO transactions VALUES ('2010-02-10 00:00:00')''')
<sqlite3.Cursor object at 0x000000000531CCE0>
>>> cur.execute('''INSERT INTO transactions VALUES ('2017-02-10 00:00:00')''')
<sqlite3.Cursor object at 0x000000000531CCE0>
>>> list(cur.execute("SELECT * from transactions where transactionsdate >= '2010-02-19 00:00:00'"))
[('2017-02-10 00:00:00',)]
>>> list(cur.execute("SELECT * from transactions"))
[('2010-02-10 00:00:00',), ('2017-02-10 00:00:00',)]

暗中刺探:您能否将字段的内容转储到文本文件中并使用(例如)Notepad++ 进行检查,这样可以查看干扰的非打印字符?

【讨论】:

  • 嗨,当我导出为 CSV 并在 NotePad++ 中打开时,事务日期显示为“'2017-02-18 00:00:00'”,这正是我的预期
  • 正如我所说,在黑暗中拍摄。 (你确实检查了View | Show Symbols | Show All Characters?)
  • 是的,我做到了,肯定只是记事本++窗口中的'2017-02-18 00:00:00'
  • 好吧,我放弃了。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多