String SQLite日期字符串比较。相同的格式不起作用
请帮忙!这让我快发疯了。是的,我看过几十个类似问题的堆栈溢出答案,他们都说“你的日期应该是一致的接受格式” 我的所有SQLite日期都以以下字符串格式存储:String SQLite日期字符串比较。相同的格式不起作用,string,sqlite,date,format,comparison,String,Sqlite,Date,Format,Comparison,请帮忙!这让我快发疯了。是的,我看过几十个类似问题的堆栈溢出答案,他们都说“你的日期应该是一致的接受格式” 我的所有SQLite日期都以以下字符串格式存储: 'yyyy-MM-dd HH:mm:ss' 我试着做日期比较,但没有效果。例如: SELECT transactiondate FROM transactions WHERE transactiondate >= '2010-02-19 00:00:00' 不起作用。。我返回
'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(…)的每一种排列,但都没有效果。我也试过使用。。。之间而且…,这没用
如果有人能解决这个问题,请提前感谢。好的,这不是答案。但是在评论中你不能做这种事 我无法复制你的情况。代码,特别是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',)]
导入sqlite3
>>>conn=sqlite3.connect(“:内存:”)
>>>cur=连接光标()
>>>cur.execute('创建表事务(transactionsdate字符串)')
>>>当前执行(“”“插入交易值('2010-02-10 00:00:00')“”)
>>>当前执行(''插入交易值('2017-02-10 00:00:00')'')
>>>列表(当前执行(“从TransactionDate>='2010-02-19 00:00:00'”的事务中选择*)
[('2017-02-10 00:00:00',)]
>>>列表(当前执行(“从事务中选择*))
[('2010-02-10 00:00:00',), ('2017-02-10 00:00:00',)]
暗中捅:你能把字段的内容转储到文本文件中,并用记事本++检查它吗?记事本++可以看到干扰的非打印字符吗?你的数据中包含了“前端和后端”。列中的transactiondate 然后,您还需要在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而不需要额外的字符。从事务中选择不同的长度(transactiondate);检查不可见的字符。检查空间是否真的是一个标签。我自己使用sqlite来处理这些日期时间的事情,虽然我的格式是yyyymmdd hh:mi:ss.Hi,但我得到了1个结果:length(transactiondate)21,它不同于19。“看不见的魔咒”理论越来越强大。是新线的角色吗?exstra空间?可能数据可以用UPDATE和SUBSTR修复。但是“'2010-02-19 00:00:00'”的长度是21,包括单个引号作为诊断,尝试使用
date
函数将表中存储的一些值转换为“内部”表示,然后再返回“查看发生了什么”?您好,当我导出为CSV并在NotePad++中打开时,transactiondate显示为“'2017-02-18 00:00:00'”,正如我所说,这是在黑暗中拍摄的。(您确实选中了View | Show Symbols | Show All Characters
吗?)是的,我选中了,肯定只是在记事本++窗口中的“2017-02-18 00:00:00”好的,我放弃了。:)哦,我明白了,我没有意识到单引号是数据的一部分,我想这表明它是一个字符串值!非常感谢,+1'd:)我使用T-SQL和VB web服务工作了一年,因此我的假设是(这种比较以前一直有效)。