在PostgreSQL中从年和月值生成日期

时间:2017-08-03 19:13:55

标签: postgresql date concat

您好我将连续日期值转换为实际日期时遇到两个问题。

我已经厌倦了here来将连接值转换为to_char(DATE ...),但我一直在变得奇怪。我认为这是因为我的月份前面没有零填充。

这是我的基本查询:

SELECT 

   expiry_month,
   expiry_year,
   to_date(CONCAT(expiry_year, expiry_month), 'YYYY/MM'),

FROM thisTable

以下是数据输出的示例:

expiry_month    expiry_year   concatvalues
9               2018          20189-01-01   
1               2019          20191-01-01
5               2016          20165-01-01
3               2019          20193-01-01
10              2017          201710-01-01
2               2020          20202-01-01

我想我需要LPAD()我的月份值来解析正确的日期。例如。 01不是1,05不是5.

然而,当我尝试LPAD月份值时,它不起作用。我试过了:

lpad(to_char(expiry_month),2,'0'),

我收到此错误'提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。'

我不明白,因为lpad是一个功能。关于如何使用LPAD()

的任何建议

感谢您的建议。

编辑1

我尝试使用以下代码更新to_date()函数:

to_date(CONCAT(payment_cards.expiry_year || ' - ' || payment_cards.expiry_month || ' - 01'), 'YYYY-MM-01')现在又抛出了一个不同的错误:

ERROR: invalid value "- " for "MM" DETAIL: Value must be an integer.

我仍然认为我需要填写月份日期?

2 个答案:

答案 0 :(得分:1)

缺少'/'

SELECT

   expiry_month,
   expiry_year,
   to_date(CONCAT(expiry_year, '/', expiry_month), 'YYYY/MM') AS the_start_of_year_month

FROM thisTable ;

将产生:

expiry_month | expiry_year | the_start_of_year_month
-----------: | ----------: | :----------------------
           9 |        2018 | 2018-09-01             
           1 |        2019 | 2019-01-01             
           5 |        2016 | 2016-05-01             
           3 |        2019 | 2019-03-01             
          10 |        2017 | 2017-10-01             
           2 |        2020 | 2020-02-01             

日期格式指定' /'并且它不存在,因此,整个文本被视为年份,月份和日期被视为1/1。 CONCAT('2018','9')刚刚返回'20189'(这是有效年份)。

dbfiddle here

答案 1 :(得分:0)

使用:

make_date(year int, month int, day int)

喜欢:

make_date(expiry_year, expiry_month, 1)

Postgresql documentation