首页 > 解决方案 > SQLLite strftime 不读取列值

问题描述

我在我的 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

但第一列正确呈现,但功能列返回此错误我尝试按照这些页面上的解决方案但无济于事

在 SQLite 中从日期时间获取月份

sqlite-convert-string-to-date

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

标签: sqlsqlite

解决方案


这个“我如何在查询字符串中将 8/1/2007 转换为 08/01/2017 ”将无济于事,因为这不是有效的 sqlite 时间字符串。如果 MySql 不是一个选项(它不适合我),你将不得不做“复杂的字符串函数”。一旦它们被分解,这可能是相当直截了当的。

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

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

这一天要打字多一点,因为您需要第一个'/'之后的字符串部分。printf('%02i',CAST (substr(adate,instr(adate,'/') + 1) as int))会成功的。

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


推荐阅读