小编典典

SQLLite strftime不读取列值

sql

我在Sqllite数据库查询中有这个,我想…

select BoardingDate, strftime('%Y', date(BoardingDate)) from Hostels;

但是在输出中它可以BoardingDate正确渲染,并且输出

BoardingDate        Month 
-------------------------
8/1/2007 0:00:00    null
3/1/2008 0:00:00    null
8/1/2008 0:00:00    null
3/1/2009 0:00:00    null

这些是查询的当前行为

 1. strftime('%Y', date('now'))         - outputs correctly
 2. strftime('%Y', date('2020-03-06'))  - it works also
 3. strftime('%Y', date(BoardingDate))  - Gives an error, it doesnt render at all.. 
 4. strftime('%Y', date(Hostels.BoardingDate))  - The same error...
 5. strftime('%Y', datetime(BoardingDate))  - Gives an error,
 6. strftime('%Y', datetime(Hostels.BoardingDate))  - doesnt work....

它打印字符串,我不知道为什么。它以这种方式工作。我正在尝试使用该julianday()函数计算日期,但是那是一个更长的方法,我现在很困惑。谢谢。

这是我在消息面板中得到的错误

select BoardingDate, strftime('%Y',BoardingDate)
> no such column: BoardingDate
> Time: 0s

我已经尝试过本文档lang_datefunc.html中的其他函数,
但是当我尝试将列引用作为函数中的参数传递时,我仍然遇到相同的错误


阅读 279

收藏
2021-04-15

共1个答案

小编典典

这种“ 如何在查询字符串 中将 2007年8月1日转换为2017年8月1日
”将无济于事,因为这不是有效的sqlite时间字符串。而且如果MySql不是一个选项(这对我来说不是),那么您将不得不执行“ 复杂的字符串函数
”。一旦它们分解,这可能是相当简单的。

年份很简单,substr(adate,-12,4) 假设
时间部分的小时数只有一位数字(否则为-13)。如果您真的只想要年份(基于'%Y'),那么bob是您的叔叔。

同样,本月也很容易。利用CAST它将文本转换为整数,直到第一个非数字字符,并使用printf到0 pad,这printf('%02i',CAST (adate as int))将给出月份。

那天要输入一些内容,因为您需要在字符串的第一个’/’ 之后添加 部分。这printf('%02i',CAST (substr(adate,instr(adate,'/') + 1) as int))将达到目的。

剩下的就是将它们全部与它们-之间的一些连接在一起,瞧,这是一个有效的sqlite日期。

2021-04-15