【问题标题】:Producing date from year and month values in PostgreSQL从 PostgreSQL 中的年月值生成日期
【发布时间】:2017-08-03 19:13:55
【问题描述】:

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

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

我还在想我需要填写月份日期吗?

【问题讨论】:

  • 你的表中expiry_monthexpiry_year的列有哪些类型?它们是整数吗?月份是表示为整数还是日期(实际月份的第一天)?
  • 另请注意您提供给to_date 函数的格式模式包含/,但您没有将其包含在连接值中。应该可能匹配...
  • @joanolo 都是整数。
  • 试试CONCAT(expiry_year, '/', expiry_month), 'YYYY/MM') 看看它是否有效。您指定了一个'/',它不在您的文本中,因此,整个文本被视为年,月和日被视为 1/1
  • @Chef1075:我已经修改了你的问题的标题,以真正关注核心需求(lpad() 实际上与你的情况没有任何关系)。

标签: postgresql date concat


【解决方案1】:

缺少一个'/'

SELECT

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

FROM thisTable ;

将产生:

到期月 |到期_年 | 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

【讨论】:

    【解决方案2】:

    用途:

    make_date(year int, month int, day int)
    

    喜欢:

    make_date(expiry_year, expiry_month, 1)
    

    Postgresql documentation

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多