如何在sqllite中正确投射

时间:2018-03-21 01:40:49

标签: sqlite

当我在SQLLite中转换datetime时,它会截断字符串。 例如

select cast("2017-04-23 9:12:08 PM" as datetime) as dt

返回

2017

2 个答案:

答案 0 :(得分:1)

SQLite的CAST只能转换为定义的存储类,因此只能用于转换为

无(blob),TEXT,REAL,INTEGER或NUMERIC。

然而,确定列关联性的常规规则应用于该类型,因此通过编码CAST(value AS datetime)您实际上正在使用CAST(value AS NONE)(即BLOB)。

CAST expressions

因此,您无法有效地使用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

Date And Time Functions

相关问题