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 - 将日期字符串转换为日期格式的主要内容,如果未能解决你的问题,请参考以下文章

在 Presto SQL 中将整数值转换为日期

如何在EXCEL中将字符转成日期 如19970828转成1997-08-28

如何在 Presto 中将时间戳转换为日期?

如何在 SQL Server 中将字符串转换为日期时间?

将 bigint 转换为日期(月份名称)

如何在 Presto/Hive 中将日期格式 YYYY-MM-DD 转换为整数 YYYYMMDD?