尝试了以下语法,它们都没有帮助将字符串类型列转换为日期
select INVC_,APIDT,APDDT from APAPP100 limit 10
select current_date, APIDT,APDDT from APAPP100 limit 10
select date_format( b.APIDT, '%Y-%m-%d') from APAPP100 b
select CAST( b.APIDT AS date) from APAPP100 b
select date(b.APIDT) from APAPP100 b
select convert(datetime, b.APIDT) from APAPP100 b
select date_parse(b.APIDT, '%Y-%m-%d') from APAPP100 b
select str_to_date(b.APIDT) from APAPP100 b
正确查询将字符串分解为日期的正确查询为 date_parse
。
这将导致以下查询:
select date_parse(b.APIDT, '%Y-%m-%d') from APAPP100 b
prestodb文档:6.10。日期和时间功能和操作员
@Jens Walter的答案很棒,如果您需要在其中使用单个日期格式转换列。我有这样的情况,有一个包含多个不同日期格式并仍然能够转换的列很有用。
以下查询支持包含多种不同格式日期的源列。
SELECT b.APIDT,
Coalesce(
try(date_parse(b.APIDT, '%Y-%m-%d %H:%i:%s')),
try(date_parse(b.APIDT, '%Y/%m/%d %H:%i:%s')),
try(date_parse(b.APIDT, '%d %M %Y %H:%i:%s')),
try(date_parse(b.APIDT, '%d/%m/%Y %H:%i:%s')),
try(date_parse(b.APIDT, '%d-%m-%Y %H:%i:%s')),
try(date_parse(b.APIDT, '%Y-%m-%d')),
try(date_parse(b.APIDT, '%Y/%m/%d')),
try(date_parse(b.APIDT, '%d %M %Y'))
)
FROM APAPP100 b
date_parse函数执行日期转换。
尝试函数通过返回null(如果确实发生)来处理错误。
cocece函数采用第一个非零值。
这里有一个更深入的文章(我的博客)。
这有效 -
cast(from_iso8601_timestamp(createdat) as date)
SELECT b.APIDT,
b.Appppppppp,
date_diff('day',current_date, date(b.APIDT)) AS Duedays
FROM xyz100 a
WHERE regexp_like(b.apidt, '[0-9]{4}-[0-9]{2}-[0-9]{2}')
WHERE NOT regexp_like(b.apidt, '[0-9]{4}-[0-9]{2}-[0-9]{2}')
排除垃圾日期