在创建表的时候,有客户需要将时间转为字符串,而且要求了具体的格式,如:20181115101010001。方便记录数据的更新时间,貌似是给Mysql使用,当时就很蛋疼,时间格式存储子啊数据库中就是varchar,导出来是字符串,导入到那边,是什么格式不是自动就转好了吗。但是没办法,还是得听客户的。解决办法如下:
apple=# create table test_time(id integer, crt_time varchar(32) default to_char(now(), 'YYYYMMDDHH24missms'));
CREATE TABLE
apple=# insert into test_time values(1);
INSERT 0 1
apple=# insert into test_time values(1);
INSERT 0 1
apple=# insert into test_time values(1);
INSERT 0 1
apple=# select * from test_time ;
id | crt_time
----+-------------------
1 | 20181115153505578
1 | 20181115153506225
1 | 20181115153506902
(3 rows)
1)如果在一个事务中,那么获取到的now()是一样的,而current_timestamp()的值是随系统而变化的。
2)建议使用 2018-11-15 这种方式输入日期,任何数据库都识别,不会产生歧义。
下面是PostgreSQL的时间类型:
数据类型格式化函数:
PostgreSQL格式化函数提供一套有效的工具用于把各种数据类型(日期/时间、integer、floating point和numeric)转换成格式化的字符串以及反过来从格式化的字符串转换成指定的数据类型。下面列出了这些函数,它们都遵循一个公共的调用习惯:第一个参数是待格式化的值,而第二个是定义输出或输出格式的模板。
to_char(timestamp, text)
把时间戳转换成字串
to_char(current_timestamp, 'HH12:MI:SS')
to_char(interval, text)
把时间间隔转为字串
to_char(interval '15h 2m 12s', 'HH24:MI:SS')
to_char(int, text)
把整数转换成字串
to_char(125, '999')
to_char(double precision, text)
把实数/双精度数转换成字串
to_char(125.8::real, '999D9')
to_char(numeric, text)
把numeric转换成字串
to_char(-125.8, '999D99S')
to_date(text, text)
把字串转换成日期
to_date('05 Dec 2000', 'DD Mon YYYY')
to_timestamp(text, text)
timestamp
把字串转换成时间戳
to_timestamp('05 Dec 2000', 'DD Mon YYYY')
to_timestamp(double)
timestamp
把UNIX纪元转换成时间戳
to_timestamp(200120400)
to_number(text, text)
numeric
把字串转换成numeric
to_number('12,454.8-', '99G999D9S')
double
获取子域(等效于extract)[可以获取数据表中某个日期字段的部分日期或时间]
date_part('month', interval '2 years 3 months')
MONTH
对于timestamp数值,它是一年里的月份数(1-12);对于interval数值,它是月的数目,然后对12取模(0-11)
EXTRACT(MONTH from TIMESTAMP '2001-02-16 20:38:40');
QUARTER
该天所在的该年的季度(1-4)(仅用于 timestamp)
EXTRACT(QUARTER from TIMESTAMP '2001-02-16 20:38:40');
SECOND
秒域,包括小数部分(0-59[1])
EXTRACT(SECOND from TIMESTAMP '2001-02-16 20:38:40');
该天在所在的年份里是第几周。
EXTRACT(WEEK from TIMESTAMP '2001-02-16 20:38:40');
EXTRACT(YEAR from TIMESTAMP '2001-02-16 20:38:40');
4. 当前日期/时间:
PostgreSQL 提供可许多返回当前日期和时间的函数。
部分函数按照当前事务的开始时刻返回结果:
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME(precision)
LOCALTIME
LOCALTIMESTAMP
now()
transaction_timestamp() 感觉这个描述更符合实际情况
另外部分函数返回实时时间值,在事务中也会随时间变化。
statement_timestamp()
clock_timestamp()
timeofday() 返回的是text字符串
严以律己、宽以待人