Presto SQL - 将日期字符串转换为日期格式
Posted
技术标签:
【中文标题】Presto SQL - 将日期字符串转换为日期格式【英文标题】:Presto SQL - Converting a date string to date format 【发布时间】:2017-02-14 06:52:42 【问题描述】:我在 presto 并且有一个格式化为 varchar 的日期,看起来像 -
7/14/2015 8:22:39 AM
我查看了 presto 文档并尝试了各种方法(转换、date_format、使用 split_part 解析然后转换),但没有将其转换为可以与 date_diff 等函数一起使用的日期格式。
我试过了:
cast(fieldname as timestamp)
date_format(fieldname, '%Y-%m-%d %T)
两者都给我这样的错误
'Value cannot be cast to timestamp: 3/31/2016 6:05:04 PM'
如何转换?
【问题讨论】:
我认为问题出在日期格式上。你能像2016-03-31 6:05:04 PM
这样改变格式并投射它吗?
您应该尝试 ISO 8601 格式“2016-03-31 18:05:04”。我几乎可以肯定它应该可以工作
@coladict 我试过select cast('2016-03-31 6:05:04 PM' as timestamp)
,但这也不起作用
不是6:05:04 PM
,对于上午必须是06:05:04
,对于下午必须是18:05:04
。
@coladict 这可能是数据的格式问题,但前导 0 是演员应该解决的问题。但即使我在上面的例子中添加前导 0,我仍然会得到同样的错误。
【参考方案1】:
我想通了。下面将其转换为 24 小时日期格式。
select date_parse('7/22/2016 6:05:04 PM','%m/%d/%Y %h:%i:%s %p')
见date_parse
documentation in Presto。
【讨论】:
请注意,如果你想要一个日期,你必须明确地将它转换回日期(从时间戳)——只使用像 '%Y-%m-%d' 这样的格式不是够了……【参考方案2】:你也可以这样做
date(cast('2016-03-22 15:19:34.0' as timestamp))
【讨论】:
【参考方案3】:使用:cast(date_parse(inv.date_created,'%Y-%m-%d %h24:%i:%s') as date)
输入:String timestamp
输出:date format 'yyyy-mm-dd'
【讨论】:
【参考方案4】:将日期为 Int 格式的 DateID 转换为日期格式:Presto 查询
Select CAST(date_format(date_parse(cast(dateid as varchar(10)), '%Y%m%d'), '%Y/%m-%d') AS DATE)
from
Table_Name
limit 10;
【讨论】:
【参考方案5】: select date_format(date_parse(t.payDate,'%Y-%m-%d %H:%i:%S'),'%Y-%m-%d') as payDate
from testTable t
where t.paydate is not null and t.paydate <> '';
【讨论】:
【参考方案6】:如果你的字符串是 ISO 8601 格式,你也可以使用from_iso8601_timestamp
【讨论】:
【参考方案7】:SQL 2003 标准定义格式如下:
<unquoted timestamp string> ::= <unquoted date string> <space> <unquoted time string>
<date value> ::= <years value> <minus sign> <months value> <minus sign> <days value>
<time value> ::= <hours value> <colon> <minutes value> <colon> <seconds value>
在两者之间有一些定义只是链接回这些定义,但简而言之,YYYY-MM-DD HH:MM:SS
和可选的.mmm
需要毫秒才能在所有 SQL 数据库上工作。
【讨论】:
是的,但这与上午/下午有关。如果我这样做select cast('2016-03-31 6:05:04 PM' as timestamp)
它不起作用。但如果我删除 am/pm 并执行 select cast('2016-03-31 6:05:04' as timestamp)
那么它就可以了。但我需要上午/下午或转换为 24 小时制。
如果你坚持使用非标准的3/31/2016 6:05:04 PM
文档,格式为%c/%e/%y %r
。看看prestodb.io/docs/current/functions/datetime.html
我的数据就是这样格式化的。我愿意重新格式化,但不知道如何。那是我的问题。根据上面的评论,如果我这样做 date_format('7/22/2016 6:05:04 PM', '%c/%e/%y %r')
也会给我一个错误【参考方案8】:
date_format
要求第一个参数为timestamp
,因此不是转换字符串的最佳方法。请改用date_parse
。
另外,%c
用于非零填充月份,%e
用于非零填充月份日期,%Y
用于四位数年份。
SELECT date_parse('7/22/2016 6:05:04 PM', '%c/%e/%Y %r')
【讨论】:
以上是关于Presto SQL - 将日期字符串转换为日期格式的主要内容,如果未能解决你的问题,请参考以下文章