原文地址:Oracle date timestamp 毫秒 - 時間函數總結
yyyy-mm-dd hh24:mi:ss.ff 年-月-日 時:分:秒.毫秒
--上一月,上一年
select add_months(sysdate,-1) last_month,add_months(sysdate,-12) last_year from dual;
--下一月,下一年
select add_months(sysdate,1) last_month,add_months(sysdate,12) last_year from dual;
--當月最后一天
select LAST_DAY(sysdate) from dual;
--下周日期
select next_day(sysdate,'星期五') "下周五" from dual;
select next_day(sysdate, 'Friday') "Next Friday" from dual;
select next_day(sysdate, 4) from dual;
如果你不確定自己的時區或者你擔心從一個時區移植到另一個時區時,SQL語句會出錯,Oracle還允許你用數字的形式來表示工作日。
但是要記得一點:1表示的是周日,2表示的是周一,3表示的是周二,依此類推。
--固定日期一天
select * from account a where a.applytime>= to_date('2011-02-26','yyyy-mm-dd') and a.applytime< to_date('2011-02-27','yyyy-mm-dd');
--前天一天
select * from account a where a.applytime>= to_date(to_char(sysdate-2,'yyyy-mm-dd'),'yyyy-mm-dd') and a.applytime< to_date(to_char(sysdate-1,'yyyy-mm-dd'),'yyyy-mm-dd');
昨天一天
select * from dxw_tmp a where a.applytime>= to_date(to_char(sysdate-1,'yyyy-mm-dd'),'yyyy-mm-dd') and a.applytime< to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd');
--今天一天
select * from account a where a.applytime>= to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') and a.applytime< to_date(to_char(sysdate+1,'yyyy-mm-dd'),'yyyy-mm-dd');
上月第一天
select to_date(to_char(add_months(sysdate,-2)+1,'yyyy-mm-dd'),'yyyy-mm-dd') from dual ;
上月最后一天
select to_date(to_char(add_months(sysdate,-1),'yyyy-mm-dd'),'yyyy-mm-dd') from dual;
select * from account a where a.applytime>= to_date(to_char(add_months(sysdate,-2)+1,'yyyy-mm-dd'),'yyyy-mm-dd') and a.applytime<= to_date(to_char(add_months(sysdate,-1),'yyyy-mm-dd'),'yyyy-mm-dd');
select to_date(to_char(add_months(sysdate,-2),'yyyy-mm-dd'),'yyyy-mm-dd') from dual;
select to_date(to_char(add_months(sysdate,-3)+1,'yyyy-mm-dd'),'yyyy-mm-dd') from dual ;
--trunc 截取日期
--當天零點
select trunc(sysdate,'dd') from dual;
--當月一號
select trunc(sysdate,'mm') from dual;
--本年一月一號
select trunc(sysdate,'yyyy') from dual;
--可以根據需要自己去截取
關於毫秒:
Oracle 毫秒的存儲必須字段類型為 timestamp(6) –數字表示存儲的毫秒位數
--當前毫秒級時間
select to_char(current_timestamp,'yyyy-mm-dd hh24:mi:ss.ff6') from dual;
--字符串轉為 timestamp類型
select to_timestamp('2012-02-03 10:29:46.453234','yyyy-mm-dd hh24:mi:ss.ff6') from dual;
--timestamp轉為字符型
select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss.ff6') from dual;
PS: ff后面的數字表示獲得的毫秒位數,默認是6;一般ff3 獲得三位毫秒數。
如果你想把DATE類型轉換成TIMESTAMP類型,就使用CAST函數。
select cast(sysdate as timestamp) from dual;
但是值得注意的是:在轉換后的時間段尾部有了一段“.000000”。這是因為從date轉換過來的時候,沒有小數秒的信息,缺省為0。而且顯示格式是按照參數NLS_TIMESTAMP_FORMAT定的缺省格式顯示。當你把一個表中date類型字段的數據移到另一個表的timestamp類型字段中去的時候,可以直接寫INSERT SELECT語句,oracle會自動為你做轉換的。
注意: to_char函數支持date和timestamp,但是trunc卻不支持TIMESTAMP數據類型。這已經清楚表明了在當兩個時間的差別極度重要的情況下,使用TIMESTAMP數據類型要比DATE數據類型更確切。
還值得一提的是:毫秒的顯示精度是6位,不過有效位是3位,即最大值達到999,滿1000ms就進為1s。當然你想保存6位毫秒也是有辦法的:
insert 值指定六位:to_timestamp('2012-02-03 10:29:46.453234','yyyy-mm-dd hh24:mi:ss.ff6')