表名为tabelea
列为name,expdate
。两列都没有空约束。两列都有不同的数据类型。
值
name expdate
A '10-05-2015'
B ' '
现在我想获取expdate
不为空的值,然后转换为日期格式,否则为空。所以我试过这个
select name,case when replace(expdate,' ','') <> '' then
to_char(cast(expdate as date),'dd-MM-yyyy') else null end from tablea
但是不能正常显示错误类型日期的输入语法无效:&#34;&#39; &#39;&#34;
如何解决这个问题?
我也试过trim
。
Postgresql 9.3
答案 0 :(得分:2)
如果将空字符串转换为null
值,则可以在单个调用中将其组合:
select name,
to_char(cast(nullif(trim(expdate), '') as date),'dd-MM-yyyy')
from tablea;
cast
依赖于一些隐式数据类型转换。最好使用带有显式格式的to_date()
:
to_char(to_date(nullif(trim(expdate), ''), 'dd-mm-yyyy'),'dd-MM-yyyy')
SQLFiddle示例:http://sqlfiddle.com/#!15/a9831/1
答案 1 :(得分:1)
您可以使用代字号将字符串与所需的日期模式进行比较,然后再将其作为日期:
select
name,
case when expdate ~ '^[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{4}$' then
to_date(expdate, 'dd-MM-yyyy')
else
null
end as the_date
from tablea;
(当然,首先使用字符串数据类型来存储日期是个坏主意。)