postgresql的now()為當(dāng)前事務(wù)開(kāi)始時(shí)間,
而Oracle的sysdate是當(dāng)前時(shí)間。
區(qū)別在于事務(wù)。
postgresql中的now():
postgres=# begin ;
BEGIN
postgres=# select now();
now
-------------------------------
2017-03-31 14:28:32.403869+08
(1 row)
postgres=# select now();
now
-------------------------------
2017-03-31 14:28:32.403869+08
(1 row)
postgres=# select now();
now
-------------------------------
2017-03-31 14:28:32.403869+08
(1 row)
postgres=# end;
COMMIT
postgres=# select now();
now
-------------------------------
2017-03-31 14:28:54.917897+08
(1 row)
postgres=#
而Oracle中的sysdate在事務(wù)中是一直變化的。
總結(jié):
- postgresql的now()為當(dāng)前事務(wù)開(kāi)始時(shí)間,如果調(diào)用now(),就會(huì)獲取事務(wù)開(kāi)始的時(shí)間,而不是獲取的系統(tǒng)當(dāng)前的時(shí)間。
- Oracle的sysdate是獲取當(dāng)前時(shí)間,啥時(shí)候調(diào)用sysdate,就是啥時(shí)候的時(shí)間。
補(bǔ)充:mysql中now()函數(shù)的使用,還有oracle的sysdate,可能埋下的坑
mysql中now()函數(shù)的使用,還有oracle的sysdate
在需求中如果系統(tǒng)中藥添加當(dāng)前操作的時(shí)間那么很簡(jiǎn)單的一個(gè)操作在寫(xiě)sql的時(shí)候直接在這個(gè)字段對(duì)應(yīng)的位置寫(xiě)上now()函數(shù)就可以了,這樣就少些了很多代碼,尤其是在在用jdbc時(shí)寫(xiě)的時(shí)候,可以少寫(xiě)一些關(guān)于占位符的代碼,但是這樣做是有一個(gè)隱含的前提的是數(shù)據(jù)庫(kù)和服務(wù)器是在同一個(gè)機(jī)器上的,如果不在同一臺(tái)機(jī)器上,那么這樣寫(xiě)就是一個(gè)坑啊,我覺(jué)得沒(méi)有經(jīng)驗(yàn),沒(méi)有掉進(jìn)過(guò)坑的人就會(huì)這樣寫(xiě),比如我,偷懶就會(huì)這樣寫(xiě).等到用到這個(gè)時(shí)間來(lái)比較或者作為業(yè)務(wù)邏輯的判斷依據(jù)時(shí),這個(gè)坑就出現(xiàn)了
lz在定位問(wèn)題做業(yè)務(wù)的時(shí)候就遇到了,當(dāng)時(shí),服務(wù)器在lz的電腦上,數(shù)據(jù)庫(kù)在遠(yuǎn)端,因?yàn)闃I(yè)務(wù)需要就把時(shí)間調(diào)到未來(lái)的一個(gè)時(shí)間點(diǎn),然后開(kāi)始做,但是后來(lái)經(jīng)過(guò)了1周左右,偶然發(fā)現(xiàn)了一個(gè)表用的時(shí)間竟然時(shí)當(dāng)前的真是時(shí)間,我就有了這樣的猜測(cè),應(yīng)該有一個(gè)程序員用了sysdate字段.盡管沒(méi)有明顯找到,但是應(yīng)該是用的,不然不會(huì)取到真實(shí)的時(shí)間啊.尤其一些需要遠(yuǎn)程調(diào)試的項(xiàng)目,同事對(duì)于編碼規(guī)范,我覺(jué)得sql的編碼規(guī)范也要把這一條加上去.
lz以前不懂也做過(guò)這樣的事情,現(xiàn)在只能提醒大家不要這樣做,然后改掉自己最近這樣寫(xiě)的代碼.
建議用java生成new一個(gè)時(shí)間對(duì)象,如果用的是jdbc直接拼在sql里,可以不要用占位符.
//在dao中這樣寫(xiě)
member(name,pw,register_time)value(?,?,'"+DbAssitor.sdfyyyyMMddHHmmss.format(new Date())+"');";
//數(shù)據(jù)庫(kù)助手類定義一個(gè)sdf類
public class DbAssitor
{
/** 數(shù)據(jù)庫(kù)相關(guān)操作中操作結(jié)果是沒(méi)有影響行數(shù) ***/
public static int NO_AFFECT_ROW = 0;
public static String sdfyyyyMMddHHmmss_ = "yyyy-MM-dd HH:mm:ss";
public static SimpleDateFormat sdfyyyyMMddHHmmss = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- PostgreSQL批量update與oracle差異詳解
- PostgreSQL通過(guò)oracle_fdw訪問(wèn)Oracle數(shù)據(jù)的實(shí)現(xiàn)步驟