从 PostgreSQL 中的年份和月份值生成日期

Producing date from year and month values in PostgreSQL

您好,我在将串联日期值转换为实际日期时遇到了两个问题。

我已经厌倦了寻找 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'),

我收到这个错误 'HINT: No function matches the given name and argument types. You might need to add explicit type casts.'

我不明白,因为 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.

我还在想我需要填充月份吗?[=​​20=]

缺少 '/'

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

使用:

make_date(year int, month int, day int)

喜欢:

make_date(expiry_year, expiry_month, 1)

Postgresql documentation