Postgresql:日期格式和本地语言输出

时间:2017-05-10 13:59:47

标签: postgresql

我对postgresql有两个问题。 第一个是我必须以特定格式转换日期,如:2016年11月4日星期五

SELECT to_char(tstamp, 'Day DD month YYYY') FROM ...

结果是:https://i.stack.imgur.com/RjNnm.png

首先看tstamp表消失了,字符串中有更多空格:

friday....04.November..2016

*十六进制编码

第二个是我必须用语言格式转换它,例如意大利语:“Venerdì04Novembre 2016”。

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

关于第一个问题:额外的空格是因为monthDay模式是:

  

空白填充到9个字符

https://www.postgresql.org/docs/9.6/static/functions-formatting.html

所以,如果你想删除这个空格,你可以尝试这样的事情:

 select trim(to_char(localtimestamp(0), 'Day'))||to_char(localtimestamp(0), ' DD ')||trim(to_char(localtimestamp(0), 'month'))||to_char(localtimestamp(0), ' YYYY')

-

关于意大利语,可能还有其他方法,但这也应该有效。你可以硬编码意大利语的月份和日期名称,并使用case表达式“翻译”它们,如下所示:

select 
    case 
        when trim(to_char(tstamp, 'Day')) = 'Monday' then 'Monday_in_italian' 
        when trim(to_char(tstamp, 'Day')) = 'Tuesday' then 'Tuesday_in_italian'
        when trim(to_char(tstamp, 'Day')) = 'Wednesday' then 'Wednesday_in_italian' 
        -- another days here
    end||
    to_char(tstamp, ' DD ')||
    case 
        when trim(to_char(tstamp, 'month')) = 'january' then 'January_in_italian'
        when trim(to_char(tstamp, 'month')) = 'february' then 'February_in_italian'
        -- another months here
    end||
    to_char(tstamp, ' YYYY')
    as tstamp 
    from your_table

请注意,如果您希望随时正常工作,则应将所有7天和所有12个月的名称放在案例表达式中。

甚至更好,在case语句中,您可以使用D模式确定日期和MM模式。如果你想看到可用的模式列表,你可以点击链接,我已在上面发布。

答案 1 :(得分:1)

奥托的答案一切都很好,但编码过多。如果您的操作系统不支持意大利语本地化(locale -a),请使用它。但如果确实如此,您可以像这样格式化您的时间:

t=# set lc_time to 'it_IT.utf8';
SET
Time: 0.295 ms
t=# select to_char(now(), 'TMDay, DD TMMonth YYYY');
         to_char
-------------------------
 Giovedì, 11 Maggio 2017
(1 row)

Time: 3.705 ms

格式化anf TM前缀说明can be found in docs