2017-07-12 42 views
0

PostgreSQL 9.5版本中是否有内置的函数来计算相应的世纪/千年?相当于Postgres的RR MILLENNIUM

当我使用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”。

我需要使用CASE语句,当长度为7个字符,然后前缀19千年,当它的9个字符,只是加载它,因为它是。

+0

TO_TIMESTAMP(birth_date, 'DDMONYYYY')给了我喜欢“0080-06-28 00的值: 00:00 + 00“和”0048-04-25 00:00:00 + 00“ –

+0

您可以试试吗?选择to_timestamp('25APR48','ddmonyy')。对我来说,结果集是“2048-04-25 00:00:00 + 00”。我期待它开始于1948年 –

回答

0

https://en.wikipedia.org/wiki/Unix_timeUnix纪元是

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

所以,如果你不指定的世纪,但只是最后YY它将从00:00:00 1 January和21世纪前YY等于70 20世纪。如果你想让它去猜测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

在从字符串转换成timestamp或日期,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) 
+0

感谢Vao,to_timestamp('31DEC69 20','ddmonyy cc')似乎对我来说是不错的选择。但我无法在VARCHAR字段Ex中包含日期的表列上执行此操作:从模式中选择to_timestamp(to_date(birth_date,'DDMONYYYY')||''|| 19,'ddmonyy cc') 。表了' –

+0

@HarinathArasu updtaed与例如串联的为你解答 –

+0

'创建表schema.arasu(member_birth_date字符(9)) INSERT INTO schema.arasu值( '28JUN80') 选择TO_TIMESTAMP没有工作('20'|| member_birth_date,'ddmonyy cc')。arasu a' –