RR MILLENNIUM相当于Postgres

时间:2017-07-12 04:44:40

标签: postgresql postgresql-9.4

PostgreSQL 9.5版本中是否有内置函数来计算适当的世纪/千年?

当我从表中使用birth_date :: TIMESTAMP时,有时它前缀为19,有时它是前缀20.下面的例子

输入:

28JUN80  
25APR48

输出:

"1980-06-28 00:00:00"  
"2048-04-25 00:00:00"

我还在表格中有记录,其中birth_date保持值为" 07APR1963"它被恰当地计算为" 1963-04-07 00:00:00"。

当长度为7个字符时,我需要使用CASE语句,然后前缀为19千字节,当它的9个字符时,只需按原样加载它。

1 个答案:

答案 0 :(得分:0)

https://en.wikipedia.org/wiki/Unix_time Unix纪元

  

开始(1970年1月1日00:00:00)

因此,如果你没有指定世纪,但只是最后YY它将是00:00:00 1 January之前的20世纪和YY等于70之前的21世纪。如果你想让它猜测20世纪就像你一样追加年份,或指定CC,例如:

t=> select 
  to_timestamp('1JAN70', 'ddmonYY')
, to_timestamp('31DEC69', 'ddmonyy')
, to_timestamp('31DEC69 20', 'ddmonyy cc');
      to_timestamp      |      to_timestamp      |      to_timestamp
------------------------+------------------------+------------------------
 1970-01-01 00:00:00+00 | 2069-12-31 00:00:00+00 | 1969-12-31 00:00:00+00
(1 row)

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

  

在从字符串到时间戳或日期的转换中,CC(世纪)   如果存在YYY,YYYY或Y,YYY字段,则忽略该字段。如果使用CC   如果是YY或Y,则将年份计算为指定年份   世纪。如果指定世纪但年份不是,那么第一个   假定这个世纪的一年。

<强>更新

所以在你的情况下,你应该做像:

vao=# create table arasu (member_birth_date character(9)); insert into arasu values ('28JUN80'),('25APR48');
CREATE TABLE
INSERT 0 2
vao=# select to_timestamp(member_birth_date||' 20', 'ddmonYY cc') from arasu;
      to_timestamp
------------------------
 1980-06-28 00:00:00+03
 1948-04-25 00:00:00+03
(2 rows)