PostgreSQL時(shí)間日期的語法及注意事項(xiàng)
sql時(shí)間用法
PostgreSQL 提供了大量用于獲取系統(tǒng)當(dāng)前日期和時(shí)間的函數(shù),例如 current_date、current_time、current_timestamp、clock_timestamp()、localtimestamp、now()、statement_timestamp()等;同時(shí)還支持延遲語句執(zhí)行的 pg_sleep()等函數(shù)
數(shù)據(jù)庫有很多,mysql、sqlserver等存在存儲過程,所需要用到的函數(shù)各不相同,本文列舉一下PostgreSQL的語法。
日期和時(shí)間函數(shù)主要用來處理日期和時(shí)間值,一般的日期函數(shù)除了使用date類型的參數(shù)外,也可以使用datetime或者timestamp類型,但會忽略這些值的時(shí)間部分。相同的以time類型值為參數(shù)的函數(shù),可以接受timestamp類型的參數(shù),但會忽略日期部分。
獲取當(dāng)前日期的函數(shù)&&獲取當(dāng)前時(shí)間的函數(shù)
1、獲取當(dāng)前日期的函數(shù)和獲取當(dāng)前時(shí)間的函數(shù):current_date和current_time
2、調(diào)用該函數(shù)時(shí)不需要在函數(shù)名后加括號。該日期是服務(wù)器的日期,不是客戶端的日期。
注意:
上面所有的函數(shù),包括 CURRENT_DATE,返回的都是當(dāng)前事務(wù)開始的時(shí)間。在同一個(gè)事務(wù)期間,多次調(diào)用相同的函數(shù)將會返回相同的值,結(jié)果不會隨著時(shí)間增加。這一點(diǎn)與其他數(shù)據(jù)庫的實(shí)現(xiàn)可能不同。
獲取當(dāng)前日期的函數(shù)
current_date函數(shù):的作用是將當(dāng)前日期按照“YYYY-MM-DD”格式的值返回,具體格式根據(jù)函數(shù)用在字符串或是數(shù)字語境中而定的。
select current_date;
獲取當(dāng)前時(shí)間的函數(shù)
current_time函數(shù):的作用是將當(dāng)前時(shí)間以“HH:MM:SS”的格式返回,具體格式根據(jù)函數(shù)用在字符串或是數(shù)字語境中而定的。
select current_time;;
localtime函數(shù):的作用是將當(dāng)前時(shí)間以“HH:MM:SS”的格式返回并且localtime沒有時(shí)區(qū)。
select localtime;
獲取當(dāng)前日期加時(shí)間的函數(shù)
基本上current_timestamp,transaction_timestamp()和now()完全相同。current_timestamp是一個(gè)函數(shù)的語法奇怪,沒有尾對括號,這是根據(jù)sql標(biāo)準(zhǔn)。
如果未在sql語句中聲明函數(shù)調(diào)用的列別名(需要一個(gè)),則別名默認(rèn)為函數(shù)的名稱。在內(nèi)部,標(biāo)準(zhǔn)sql current_timestamp使用now()實(shí)現(xiàn),并在您查看默認(rèn)列別名時(shí)顯示。
函數(shù): current_timestamp
select current_timestamp;
函數(shù): transaction_timestamp()
transaction_timestamp() 等價(jià)于 current_timestamp,但是作用更加明確。
select transaction_timestamp();
函數(shù): statement_timestamp()
statement_timestamp()返回當(dāng)前語句的開始時(shí)間,更準(zhǔn)確地說,應(yīng)該是接收到客戶端最新命令的時(shí)間。與transaction_timestamp相比,對于事務(wù)中的第一個(gè)命令返回的結(jié)果相同,但隨后再執(zhí)行 statement_timestamp() 將會返回不同的值。
select transaction_timestamp(); select statement_timestamp();
BEGIN; BEGIN SELECT statement_timestamp(); SELECT pg_sleep(3); SELECT statement_timestamp(); COMMIT; COMMIT
兩次執(zhí)行結(jié)果之間相差了 3 秒左右。
當(dāng)我們在存儲過程(Stored Procedure)中進(jìn)行調(diào)試時(shí),通常需要打印不同語句消耗的時(shí)間;此時(shí)就需要使用 statement_timestamp(),而不能使用 CURRENT_TIMESTAMP 或者 transaction_timestamp():
CREATE OR REPLACE sp_test ... DECLARE lts_systimestamp timestamp; BEGIN; lts_systimestamp := statement_timestamp(); ... RAISE NOTICE 'Step 1 take time: %', statement_timestamp() - lts_systimestamp; ... END;
函數(shù): clock_timestamp()
clock_timestamp()與statement_timestamp()相比,后者是接收到客戶端信息的時(shí)候更新時(shí)間,而clock_timestamp()接受到信息以后每次調(diào)用這個(gè)函數(shù)打印的時(shí)間戳都不一樣。返回的是實(shí)際時(shí)間。
SELECT clock_timestamp(); SELECT clock_timestamp() FROM generate_series(1,10);
clock_timestamp() 返回當(dāng)前實(shí)際的時(shí)間,即使在同一個(gè) SQL 語句中也可能返回不同的值:
因?yàn)槲沂褂玫氖荄beaver客戶端,所以返回的精度不高。正常來說,查詢語句在 1 秒鐘內(nèi)返回了 10 條記錄,但是每條記錄產(chǎn)生的時(shí)間都不相同。
函數(shù): timeofday()
timeofday()與clock_timestamp()一樣返回的是實(shí)際的時(shí)間,不過timeofday()函數(shù)返回類型是一個(gè)格式化的字符串,而不是 timestamp with time zone:
SELECT timeofday(); SELECT timeofday() FROM generate_series(1,10);
函數(shù): now()
now()與transaction_timestamp() 一樣
select now() ;
注意: now() 是 PostgreSQL 中與 transaction_timestamp() 等價(jià)的一個(gè)傳統(tǒng)函數(shù),同一個(gè)事務(wù)中的結(jié)果不會改變。
另外,所有的日期/時(shí)間數(shù)據(jù)類型都支持使用字面值’now’指定當(dāng)前日期和時(shí)間(當(dāng)前事務(wù)開始時(shí)間)。因此,以下語句效果相同:
SELECT CURRENT_TIMESTAMP; SELECT now(); SELECT TIMESTAMP 'now';
另外,PostgreSQL 還提供了其他幾個(gè)特殊的日期和時(shí)間字面值:
以上函數(shù)分別返回 UTC 1970 年 1 月 1 日零點(diǎn)、今天午夜、明天午夜、昨天午夜以及 UTC 零點(diǎn)。
延遲執(zhí)行
以下函數(shù)可以用于延遲服務(wù)器進(jìn)行的操作:
pg_sleep(seconds) pg_sleep_for(interval) pg_sleep_until(timestamp with time zone)
函數(shù): pg_sleep()
pg_sleep 將當(dāng)前會話的進(jìn)行暫停指定的秒數(shù)。seconds 的類型為 double precision,所以支持小數(shù)秒。我們在面前使用了該函數(shù)。
select pg_sleep(10);
函數(shù): pg_sleep_for ()
pg_sleep_for 執(zhí)行一個(gè)延遲的時(shí)間間隔,通常用于指定一個(gè)較大的延遲。
select pg_sleep_for('2 minutes');
函數(shù): pg_sleep_until()
pg_sleep_until 可以用于指定一個(gè)進(jìn)程的喚醒時(shí)間。
select pg_sleep_until('tomorrow 05:00');
以上示例分別暫停 1.5 秒、5 分鐘以及直到明天 5 點(diǎn),在特定的存儲過程里面,可以滿足一些需求。
==注意:==使用這些延遲函數(shù)時(shí),確保當(dāng)前會話沒有鎖定過多的資源;否則,其他會話將會一直等待,導(dǎo)致系統(tǒng)性能的下降。
時(shí)間和日期函數(shù)
to_char(timestamp, text)
to_char(timestamp, text)
將時(shí)間戳轉(zhuǎn)換為字符串。
SELECT to_char(current_timestamp, 'HH:MI:SS')
to_char(int, text)
to_char(int, text)
將整數(shù)轉(zhuǎn)換為字符串。
select to_char(125, '999');
to_char(double precision, text)
to_char(double precision, text)
將實(shí)數(shù)或雙精度數(shù)轉(zhuǎn)換為字符串。
select to_char(125.8::real, '999D9');
to_date(text, text)
to_date(text, text)
將字符串轉(zhuǎn)換為日期。
select to_date('22 Oct 2022', 'DD Mon YYYY');
select to_date('2022-10-20', 'yyyy-mm-dd');
to_number(text, text)
to_number(text, text)
將字符串轉(zhuǎn)換為數(shù)字。
select to_number('12,454.8-', '99G999D9S');
to_timestamp(text, text)
to_timestamp(text, text)
將字符串轉(zhuǎn)換為時(shí)間戳。
select to_timestamp('05 Dec 2000', 'DD Mon YYYY')
date - date
date - date
日期的減法運(yùn)算。
select date '2020-01-01' - date '2020-01-05'
date_part(text, timestamp)
date_part(text, timestamp)
從時(shí)間戳中獲取子字段。
select date_part('hour', timestamp '2001-02-16 20:38:40')
date_trunc(text, timestamp)
date_trunc(text, timestamp)
截?cái)鄷r(shí)間戳到指定精度。
select date_trunc('hour', timestamp '2001-02-16 20:38:40')
extract(field from timestamp)
extract(field from timestamp)
從時(shí)間戳中獲取子字段。
select extract(hour from timestamp '2001-02-16 20:38:40')
make_date(year int, month int, day int)
make_date(year int, month int, day int)
使用年月日創(chuàng)建日期。
select make_date(2013, 7, 15);
使用timestamp來比較時(shí)間
使用timestamp來比較時(shí)間
select '2020-01-01' < '2019-01-01'::timestamp+ '360 day'
使用interval添加時(shí)間
INTERVAL ‘3’ DAY 時(shí)間間隔為3天
INTERVAL ‘2’ HOUR 時(shí)間間隔為2小時(shí)
總結(jié)
到此這篇關(guān)于PostgreSQL時(shí)間日期的語法及注意事項(xiàng)的文章就介紹到這了,更多相關(guān)PostgreSQL時(shí)間日期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
postgresql 實(shí)現(xiàn)多表關(guān)聯(lián)刪除
這篇文章主要介紹了postgresql 實(shí)現(xiàn)多表關(guān)聯(lián)刪除操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01Postgresql 查看SQL語句執(zhí)行效率的操作
這篇文章主要介紹了Postgresql 查看SQL語句執(zhí)行效率的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02PostgreSQL?流復(fù)制配置環(huán)境搭建過程
PostgreSQL 流復(fù)制是 9.0 提供的一種新的 WAL 傳遞方法,使用流復(fù)制時(shí),每當(dāng) Primary 節(jié)點(diǎn) WAL 產(chǎn)生,就會馬上傳遞到 Standby 節(jié)點(diǎn),流復(fù)制提供異步和同步兩種模式,同步模式可以保障數(shù)據(jù) 0 丟失,這篇文章主要介紹了PostgreSQL?流復(fù)制搭建,需要的朋友可以參考下2023-09-09postgresql 實(shí)現(xiàn)查詢出的數(shù)據(jù)為空,則設(shè)為0的操作
這篇文章主要介紹了postgresql 實(shí)現(xiàn)查詢出的數(shù)據(jù)為空,則設(shè)為0的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01PostgreSQL查找并刪除重復(fù)數(shù)據(jù)的方法總結(jié)
這篇文章主要給大家介紹了PostgreSQL查找并刪除重復(fù)數(shù)據(jù)的方法,文章通過代碼示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一點(diǎn)的幫助,需要的朋友可以參考下2023-10-10PostgreSQL 實(shí)現(xiàn)查詢表字段信息SQL腳本
這篇文章主要介紹了PostgreSQL 實(shí)現(xiàn)查詢表字段信息SQL腳本,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01在windows下手動初始化PostgreSQL數(shù)據(jù)庫教程
在windows下手動初始化PG,是一件比較麻煩的事,下面我具體寫一下過程,大家做一下參考。2014-09-09PostgreSQL教程(三):表的繼承和分區(qū)表詳解
這篇文章主要介紹了PostgreSQL教程(三):表的繼承和分區(qū)表詳解,本文講解了多表繼承、 繼承和權(quán)限、什么是分區(qū)表、分區(qū)表實(shí)現(xiàn)、分區(qū)和約束排除等內(nèi)容,需要的朋友可以參考下2015-05-05