【问题标题】:Is it possible to convert a column from string to datetime type in a SQL statement?是否可以在 SQL 语句中将列从字符串转换为日期时间类型?
【发布时间】:2012-08-03 15:28:46
【问题描述】:

我需要使用以下 SQL 语句查询 SQLite 数据库表。

SELECT * 
FROM Alarms 
WHERE ALARMSTATE IN (0,1,2) 
  AND ALARMPRIORITY IN (0,1,2,3,4) 
  AND ALARMGROUP IN (0,1,2,3,4,5,6,7) 
  AND DateTime(ALARMTIME) BETWEEN datetime("2012-08-02 00:00:00") 
                    AND datetime("2012-08-03 00:00:00") 
ORDER BY ALARMTIME DESC

ALARMTIME 是 TEXT 数据类型。

ALARMTIME 在 datagridview 中显示如下“08/03/2012 11:52 AM”。你能用那种格式来检查像 DateTime(ALARMTIME) 吗?

这个 SQL 语句的唯一问题是它总是返回零数据集或记录。但是,SQLite 不会抱怨语法。

【问题讨论】:

  • 我假设“警报”中有数据会导致它满足每个“与”标准?
  • @JamieKeeling,是的,表中有很多数据。
  • @ChrisMoutray,是的,当我不检查 ALARMTIME 时,它会返回一大堆记录。嗯,ALARMTIME 看起来像 2012 年 8 月 2 日上午 11:41。哦,天哪……我想我现在看到了……但在我下结论之前我想听听你的意见……:)
  • 其实我对sqlite知之甚少,感觉就是要确认/检查一下。

标签: sql sqlite datetime type-conversion


【解决方案1】:

严格来说,SQLite 没有datetime types for its columns

SQLite 没有专门用于存储日期的存储类 和/或时间。相反,SQLite 的内置日期和时间函数 能够将日期和时间存储为 TEXT、REAL 或 INTEGER 价值观

这里的问题是你使用的字符串条件不是有效的日期/时间,所以它被视为空:

sqlite> SELECT datetime("2012-08-3 00:00:00");

sqlite> SELECT datetime("2012-08-03 00:00:00");
2012-08-03 00:00:00

(注意2012-08-03 而不是2012-08-3。)

此外,请确保您的 ALARMTIME 中的值格式也正确。

【讨论】:

  • Bruno,我明白为什么我的 SQL 语句运行但没有返回任何记录。这是因为我的 ALARMTIME 列文本格式。知道这一点,只会让我的编码更加复杂。
  • 我不确定您列的内容,但如果那里的数据很好,那么您使用的条件不正确这一简单事实足以导致任何正确值的问题: SELECT datetime("2012-08-02 01:00:00") BETWEEN datetime("2012-08-02 00:00:00") AND datetime("2012-08-03 00:00:00") 返回 1,而 SELECT datetime("2012-08-02 01:00:00") BETWEEN datetime("2012-08-02 00:00:00") AND datetime("2012-08-3 00:00:00") 返回 null。
猜你喜欢
  • 2013-06-12
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 2020-09-06
相关资源
最近更新 更多