postgresql----時間類型


postgresql支持的時間類型如下圖所示:

 

日期 date:

建議日期的輸入格式為1997-01-01,雖然也支持19970101,1/1/1997,Jan-1-1997等多種格式。

 

時間戳 timestamp[(p)] with(without) time zone:

其實配置文件是可以設置時區的,且做上層業務時也不會在多個時區間切換,所以一般使用無時區的時間戳就可以滿足需要了。

建議時間戳的輸入格式為1997-01-01 00:00:00

 

時間 time[(p)] with(without) time zone:

同樣無時區的時間也是可以滿足需要的,只表示一天的時間點,不包含日期,可以有如下格式:

12:00:00,120000,12:00

8:00 AM,8:00 PM

 

時間間隔 interval [fields][(p)]

我還是比較喜歡明確的時間間隔表示方法,如:

1 year 2 months 3 days 4 hours 5 minutes 6 seconds

可以用單詞復數,也可以不用

test=# select interval '1 year 2 months 3 days 4 hours 5 minutes 6 seconds'; interval -------------------------------
 1 year 2 mons 3 days 04:05:06 (1 row) test=# select interval '2 year 2 months 3 days 4 hours 5 minutes 6 seconds'; interval --------------------------------
 2 years 2 mons 3 days 04:05:06 (1 row) test=# select interval '2 year 2 month 3 day 4 hour 5 minute 6 second'; interval --------------------------------
 2 years 2 mons 3 days 04:05:06 (1 row)

單詞太復雜?記不住?

test=# select interval '1 y 2 mon 2d 12:09:12'; interval -------------------------------
 1 year 2 mons 2 days 12:09:12 (1 row) test=# select interval '1 y 2 mon 2d 12h 09m 12s'; interval -------------------------------
 1 year 2 mons 2 days 12:09:12 (1 row)

 

幾個特殊日期和時間

 

以下是一些時間運算的示例:

test=# select timestamp(1) without time zone '2016-07-08 12:00:00.234';
timestamp
-----------------------
2016-07-08 12:00:00.2
(1 row)

test=# select time(1) without time zone '2016-07-08 12:00:00.234';
time
------------
12:00:00.2
(1 row)

test=# select date'2016-07-08' - 7; ?column? ------------
 2016-07-01 (1 row) test=# select date'2016-07-08' + 7; ?column? ------------
 2016-07-15 (1 row) test=# test=# select date'2016-07-08' + interval'1 day 2h'; ?column? ---------------------
 2016-07-09 02:00:00 (1 row) test=# select date'2016-07-08' + time'22:00'; ?column? ---------------------
 2016-07-08 22:00:00 (1 row) test=# select interval'1day' + interval'1h'; ?column? ----------------
 1 day 01:00:00 (1 row) test=# select timestamp'2016-07-08 22:00:00' + interval'2hour'; ?column? ---------------------
 2016-07-09 00:00:00 (1 row) test=# select timestamp'2016-07-08 22:00:00' - date'2016-07-08'; ?column? ----------
 22:00:00 (1 row) test=# select 10*interval'1h'; ?column? ----------
 10:00:00 (1 row)

 

與格林威治時間相互轉換

test=# select timestamp without time zone 'epoch';
      timestamp      
---------------------
 1970-01-01 00:00:00
(1 row)

test=# select timestamp without time zone 'epoch' + 3600*interval '1 sec';
      ?column?       
---------------------
 1970-01-01 01:00:00
(1 row)

 

 

時間函數:

 

函數 返回類型 描述

示例

結果
age(timestamptimestamp) interval 計算兩個時間戳的時間間隔

select age(timestamp '2001-04-10',

timestamp '1957-06-13');

43 years 9 mons 27 days
age(timestamp) interval 計算current_date與入參時間戳的時間間隔

select age(timestamp

'2016-07-07 12:00:00');

12:00:00
clock_timestamp() timestamp with time zone 當前時間戳(語句執行時變化) select clock_timestamp(); 2016-07-08 15:14:04.197732-07
current_date date 當前日期 select current_date; 2016-07-08
current_time time with time zone 當前時間 select current_time; 15:15:56.394651-07
current_timestamp timestamp with time zone 當前時間戳 select current_timestamp; 2016-07-08 15:16:50.485864-07
date_part(texttimestamp) double precision 獲取時間戳中的某個子域,其中text可以為year,month,day,hour,minute,second等

select

date_part('year',timestamp'2016-07-08 12:05:06'),

date_part('month',timestamp'2016-07-08 12:05:06'),

date_part('day',timestamp'2016-07-08 12:05:06'),
date_part('hour',timestamp'2016-07-08 12:05:06'),

date_part('minute',timestamp'2016-07-08 12:05:06'),

date_part('second',timestamp'2016-07-08 12:05:06');


2016 | 7 | 8 | 12 | 5 | 6

date_part(textinterval) double precision 功能同上,只是第二個入參為時間間隔 select date_part('hour',interval'1 day 13:00:12'); 13
date_trunc(texttimestamp) timestamp

將時間戳截斷成指定的精度,

指定精度后面的子域用0補充

 select date_trunc('hour',

timestamp'2016-07-08 22:30:33');

2016-07-08 22:00:00
date_trunc(textinterval) interval 功能同上,只是第二個入參為時間間隔 select date_trunc('hour',interval'1 year 2 mon 3 day 22:30:33'); 1 year 2 mons 3 days 22:00:00
extract(field from timestamp) double precision 功能同date_part(texttimestamp) select extract(hour from timestamp'2016-07-08 22:30:29'); 22
extract(field from interval) double precision 功能同date_part(textinterval) select extract(hour from interval'1 day 13:00:12'); 13
isfinite(date) boolean 測試是否為有窮日期 select isfinite(date'2016-07-08'),isfinite(date'infinity'); t,f
isfinite(timestamp) boolean 測試是否為有窮時間戳 select isfinite(timestamp'2016-07-08'); t
isfinite(interval) boolean 測試是否為有窮時間間隔 select isfinite(interval'1day 23:02:12'); t
justify_days(interval) interval 按照每月30天調整時間間隔 select justify_days(interval'1year 45days 23:00:00'); 1 year 1 mon 15 days 23:00:00
justify_hours(interval) interval 按照每天24小時調整時間間隔 select justify_hours(interval'1year 45days 343hour'); 1 year 59 days 07:00:00
justify_interval(interval) interval 同時使用justify_days(interval)和justify_hours(interval) select justify_interval(interval'1year 45days 343hour'); 1 year 1 mon 29 days 07:00:00
localtime time 當日時間 select localtime; 15:45:18.892224
localtimestamp timestamp 當日日期和時間 select localtimestamp; 2016-07-08 15:46:55.181583
make_date(year intmonth intday int) date 創建一個日期 select make_date(2016,7,8); 2016-07-08

make_interval(

years int DEFAULT 0, 

months int DEFAULT 0, 

weeks int DEFAULT 0, 

days int DEFAULT 0, 

hours int DEFAULT 0, 

mins int DEFAULT 0,

 secs double precision

 DEFAULT 0.0)

interval 創建一個時間間隔 select make_interval(1,hours=>3); 1 year 03:00:00

make_time(

hour int

min int

sec double precision)

time 創建一個時間 select make_time(9,21,23); 09:21:23

make_timestamp(

year intmonth int

day inthour int

min int,

 sec double precision)

timestamp 創建一個時間戳 select make_timestamp(2016,7,8,22,55,23.5); 2016-07-08 22:55:23.5

make_timestamptz(year int

month int

day inthour int

min intsec double precision, [ timezone text ])

timestamp with time zone 創建一個帶有時區的時間戳 select make_timestamptz(2016,7,8,22,55,23.5); 2016-07-08 22:55:23.5-07
now() timestamp with time zone 當前日期和時間 select now(); 2016-07-08 15:55:30.873537-07
statement_timestamp() timestamp with time zone 同now()  select statement_timestamp(); 2016-07-08 15:56:07.259956-07
timeofday() text

當前日期和時間,包含周幾,

功能與clock_timestamp()類似

select timeofday(); Fri Jul 08 15:57:51.277239 2016 PDT
transaction_timestamp() timestamp with time zone 事務開始時的時間戳 select transaction_timestamp(); 2016-07-08 16:01:25.007153-07
to_timestamp(double precision) timestamp with time zone

Convert Unix epoch

(seconds since 1970-01-01

00:00:00+00) to timestamp

select to_timestamp(1284352323);

2010-09-12 21:32:03-07

pg_sleep(seconds double precision);  

當前會話休眠seconds秒

select pg_sleep(5);  
pg_sleep_for(interval)   當前會話休眠多長時間的間隔 select pg_sleep_for('5 seconds');  
pg_sleep_until(timestamp with time zone)   當前會話休眠至什么時間點 select pg_sleep_until('2016-07-08 23:59:59');  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM