从 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)
您好,我在将串联日期值转换为实际日期时遇到了两个问题。
我已经厌倦了寻找 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)