当我在SQLLite中转换datetime时,它会截断字符串。 例如
select cast("2017-04-23 9:12:08 PM" as datetime) as dt
返回
2017
答案 0 :(得分:1)
SQLite的CAST只能转换为定义的存储类,因此只能用于转换为
无(blob),TEXT,REAL,INTEGER或NUMERIC。
然而,确定列关联性的常规规则应用于该类型,因此通过编码CAST(value AS datetime)
您实际上正在使用CAST(value AS NONE)
(即BLOB)。
因此,您无法有效地使用CAST。但是,您只需根据Date And Time Functions对适当的值(可接受的格式)使用DateTime函数,例如: -
SELECT datetime("2017-04-23 09:12:08") as dt;
结果
2017-04-23 09:12:08
或显示日期操作
select date(dt), dt FROM (
select datetime("2017-04-23 09:12:08") as dt
);
结果
2017-04-23
和
2017-04-23 09:12:08
但是,考虑到您的格式不是可接受的格式之一,您可以转换该值。这更复杂但可以做到。这是一个将执行转换的示例(虽然没有经过实质性测试): -
SELECT
CASE WHEN (CAST(hour AS INTEGER) + CAST(adjustment AS INTEGER)) > 9 THEN
datepart||' '||CAST(CAST(hour AS INTEGER) + CAST(adjustment AS INTEGER) AS TEXT)||':'||mins_and_secs
ELSE
datepart||' 0'||CAST(CAST(hour AS INTEGER) + CAST(adjustment AS INTEGER) AS TEXT)||':'||mins_and_secs
END AS converted
FROM (
SELECT substr(ts,1,10) as datepart,
CASE WHEN instr(ts,"PM") THEN 12 ELSE 0 END AS adjustment,
CASE WHEN length(ts) = 21 THEN substr(ts,12,1) ELSE substr(ts,12,2) END AS hour,
CASE WHEN length(ts) = 21 THEN substr(ts,14,5) ELSE substr(ts,15,5) END AS mins_and_secs
FROM (
select("2017-04-23 9:12:08 PM") as ts
)
);
这会导致 2017-04-23 21:12:08
。
使用select("2017-04-23 9:12:08 AM")
会导致 2017-04-23 09:12:08
使用select("2017-04-23 11:12:08 PM")
会导致 2017-04-23 23:12:08
使用select("2017-04-23 11:12:08 AM")
会导致 2017-04-23 11:12:08
答案 1 :(得分:0)
我能想出的最接近的是:
select date(datetime(strftime('%s','2017-04-23 09:12:08'), 'unixepoch'))
结果:
2017-04-23
SQLite无法识别您拥有的日期格式:
"2017-04-23 9:12:08 PM"
它不符合识别的时间字符串格式:
时间字符串可以采用以下任何格式:
YYYY-MM-DD YYYY-MM-DD HH:MM YYYY-MM-DD HH:MM:SS YYYY-MM-DD HH:MM:SS.SSS YYYY-MM-DDTHH:MM YYYY-MM-DDTHH:MM:SS YYYY-MM-DDTHH:MM:SS.SSS HH:MM HH:MM:SS HH:MM:SS.SSS now DDDDDDDDDD