【问题标题】:Converting date column in sqlite, can't query against it在sqlite中转换日期列,无法查询
【发布时间】:2016-03-23 14:33:14
【问题描述】:

我正在将 .csv 文件导入 SQLite 数据库。我正在尝试查询其中一张表。我认为它在日期上挂了,它们是 MM/DD/YYYY 格式。也不是所有的月份和日期都是两位数。

我试过这个查询:

SELECT * FROM <table> 
WHERE 'account' = <account_number> 
and 'date' between '1900-01-01' and '2013-03-03'

我也试过了:

select * from <table> 
where 'account' = <account_number> 
and 'date' > '1901-01-01' and 'date' < '2013-03-03'

它不起作用。

【问题讨论】:

  • 我认为它在约会时被挂断了并且它不起作用:这些都是非常模糊的描述。请尽可能具体(错误消息、哪个查询、您是否尝试限制正在查询的记录以查明违规记录等)。
  • @它没有返回任何东西。它应该返回记录,但是当我查询 MM/DD/YYYY 格式的日期时,它什么也不返回。如果我删除日期列,它会返回数据。没有错误消息。
  • 日期列的数据类型是什么?你能给它 CREATE TABLE 语句吗?
  • PRAGMA table_info() 返回date,date,1,,0 表是通过.import 语句创建的。

标签: sql database date sqlite


【解决方案1】:

列名不应放在单引号中。

select   * 
from     mytable 
where    account = <account_number> 
and      date between '1901-01-01' and '2013-03-02'

还要注意between的用法。

关于日期格式:当然要确保插入的记录格式正确。

如果无法控制导入数据的格式,建议在导入后进行修正:

update mytable
set date = substr(date, -4) || '-' ||  
           substr('0' || substr(date, 1, instr(date, '/')-1), -2) || '-' ||
           substr('0' || substr(date, instr(date, '/')+1, 
                         length(date)-5-instr(date, '/')), -2)
where date like '_%/_%/____';

这将查找 M/D/YYYY 格式的任何日期(日期和月份使用一位或两位数字),并将年份部分移到开头以获得 YYYY-MM-DD 格式。如果您确定原始格式是 MM/DD/YYYY(而不是 DD/MM/YYYY),那么这应该更正所有这些日期。

查看this fiddle,它将此修复应用于几个示例日期。

【讨论】:

  • 日期格式是我遇到的问题。我正在使用.import 导入数据库,并且原始数据具有该格式。有没有办法可靠地转换它?
  • 您可以考虑在您的表上创建一个触发器,该触发器将纠正格式错误的日期。
  • 我更新了我的答案以包含一个更正的update 声明,旨在将日期转换为正确的格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
相关资源
最近更新 更多