使用Postgresql将日期转换为特定格式

时间:2016-08-02 12:10:30

标签: sql postgresql

我需要使用Postgresql转换TEXT值看起来像这样的记录:

26-AUG-2015 
to:  
2015-08-26

我不确定供应商服务器上存在哪个版本的Postgresql,但我尝试使用以下命令执行select语句:

SELECT to_char(sle.log_field1, 'YYYY-MM-DD')
FROM student_log_entires sle;

但是我收到了这个错误:

Error: SQL Error: SQLSTATE[42883]: Undefined function: 7 ERROR: function to_char(text, unknown) does not exist LINE 25: AND to_char(sle.log_field1, 'YYYY-MM-DD') >=... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.

我也尝试过:

SELECT to_date(sle.log_field1, 'YYYY-MM-DD')
FROM student_log_entries sle 

但我收到了这个错误:

Error: SQL Error: SQLSTATE[22007]: Invalid datetime format: 7 ERROR: invalid value "[E] " for "YYYY" DETAIL: Value must be an integer. Query: SELECT to_date(sle.log_field1, 'YYYY-MM-DD') FROM student_log_entries sle 

任何建议/方向将不胜感激。感谢。

3 个答案:

答案 0 :(得分:2)

这假定lc_time设置为英语:

SELECT to_char(to_date('26-AUG-2015', 'DD-MON-YYYY'), 'YYYY-MM-DD');
  to_char
------------
 2015-08-26
(1 row)

答案 1 :(得分:1)

您可以将值转换为日期,然后再转换回字符串:

select to_char(to_date('26-AUG-2015', 'DD-MON-YYYY'), 'YYYY-MM-DD')

在许多情况下,将值作为日期处理可能就足够了。

您的方法不起作用,因为该值显然已经存储为字符串,因此将其转换回具有日期格式的字符串并不合理。

编辑:

您可以使用简单的正则表达式:

select (case when col ~ '^[0-9]{2}[-][A-Z]{3}[-][0-9]{4}$' 
             then to_char(to_date('26-AUG-2015', 'DD-MON-YYYY'), 'YYYY-MM-DD')
        end)

当然,如果格式错误更加微妙,那么就需要更复杂的正则表达式。

答案 2 :(得分:0)

尝试一下

SELECT to_char(sle.log_field1, 'YYYY-MM-DD') FROM student_log_entires sale;