【问题标题】:Adding hours to a timestamp column in Sqlite results in NULL, Why?将小时数添加到 Sqlite 中的时间戳列会导致 NULL,为什么?
【发布时间】:2019-03-08 03:57:57
【问题描述】:

我得到 NULL(无)来自:

SELECT DATETIME(ServiceCall_CreatedOn,'-6 hours') AS '服务创建时间:' ...

ServiceCall_CreatedOn 是一个 Sqlite 文本列,其中包含: “2019-01-20 4:48:11”(当然没有引号)

以下内容:

SELECT ServiceCall_CreatedOn AS '服务创建时间:' ...

还有以下

SELECT DATETIME('2019-01-20 4:48:11','-6 hours') AS '服务创建时间:' ...

工作!!!!

为什么 SQLite DATETIME 时间减法适用于日期文字而不是其上的 ServiceCall_CreatedOn 列?有什么解决办法?

【问题讨论】:

  • SELECT DATETIME('2019-01-20 4:48:11','-6 hours') AS 'Service Created On:' 不起作用,因为格式不正确,即小时只有 1 位数,而不是必需的 2 位数。 SELECT DATETIME('2019-01-20 04:48:11','-6 hours') AS 'Service Created On:' 确实有效。
  • 感谢 MiKET!它奏效了。

标签: sqlite datetime


【解决方案1】:

我认为您的问题是您的格式无效,因为您使用的是 1 位数字而不是 2 小时。

那是

SELECT DATETIME('2019-01-20 4:48:11','-6 hours') AS 'Service Created On:' 

返回null,而

SELECT DATETIME('2019-01-20 04:48:11','-6 hours') AS 'Service Created On:' 

返回2019-01-19 22:48:11

例如

SELECT 
    DATETIME('2019-01-20 4:48:11','-6 hours') AS 'Service Created On: Version1',
    DATETIME('2019-01-20 04:48:11','-6 hours') AS 'Service Created On: Version2'
;

结果

【讨论】:

  • 我告诉你我在几个小时的编码后被蒙蔽了。这就是问题所在。我认为是我手动更改了故障排除的时间戳并进入了故障排除循环。令人惊讶的是,SQLite 没有错误,没有警告!谢谢!
【解决方案2】:

SQLite 可以识别特定的日期时间格式,如您所见 here
您的情况中的格式不是其中之一。
所以你需要像这样重新格式化ServiceCall_CreatedOn 列的值:

SELECT DATETIME(
  case when ServiceCall_CreatedOn like '% _:%' 
    then replace(ServiceCall_CreatedOn, ' ', ' 0') 
    else ServiceCall_CreatedOn 
  end,'-6 hours'
)

它并不优雅,但它只在需要时通过在小时数字前添加0 来工作。

【讨论】:

  • 谢谢,当我手动更改时间以进行故障排除时,日期时间格式损坏了。我喜欢您对答案的补充以及解决时间格式总是不好的情况的可能方法。这不是我的情况,该列由 NOW() 填充,所以我应该没问题。
猜你喜欢
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 2019-10-25
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多