分类: Oracle
Oracle sql日期比较及函数

oracle sql日期比较:

在今天之前:

select * from abtable where TS < to_date('2018-07-03 00:00:00','yyyy-mm-dd hh24:mi:ss') AND TS <= to_date('2018-07-03 00:00:00','yyyy-mm-dd hh24:mi:ss')

在今天之后:

select * from abtable where TS > to_date('2018-07-03 00:00:00','yyyy-mm-dd hh24:mi:ss') AND TS >= to_date('2018-07-03 00:00:00','yyyy-mm-dd hh24:mi:ss')

如果TS字段为

 ts CHAR(19) default to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),

可以直接用日期查询:

select * from bd_corp where PK_CORP IN(1015,1156) AND TS < '2017-12-31 23:59:59' AND TS > '2015-01-01 00:00:00'

精确时间:

select * from TESTTB where CREATE = to_date('2018-07-03 00:00:00','yyyy-mm-dd hh24:mi:ss')

between 操作符

-- 在where 子句中使用,选取介于两个值之间的数据范围,这些值可以是数字,文本,日期
------- 不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。
------- 某些数据库会列出介于 "Adams" 和 "Carter" 之间的人,但不包括 "Adams" 和 "Carter" ;
------- 某些数据库会列出介于 "Adams" 和 "Carter" 之间并包括 "Adams" 和 "Carter" 的人;
------- 而另一些数据库会列出介于 "Adams" 和 "Carter" 之间的人,包括 "Adams" ,但不包括 "Carter" 。

在某段时间内:

select * from TESTTB where CREATE between to_date('2018-07-03 00:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2018-07-03 00:00:00','yyyy-mm-dd hh24:mi:ss')
select * from up_date where update < to_date('2018-07-03 00:00:00','yyyy-mm-dd hh24:mi:ss') and update > to_date('2018-07-03 00:00:00','yyyy-mm-dd hh24:mi:ss')
或者
select * from bd_corp where PK_CORP IN(1015,1156) AND TS < '2017-12-31 23:59:59' AND TS > '2015-01-01 00:00:00'

Oracle 获取当前日期及日期格式

获取系统日期:  SYSDATE()
格式化日期:
TO_CHAR(SYSDATE(),'YY/MM/DD HH24:MI:SS)
或 TO_DATE(SYSDATE(),'YY/MM/DD HH24:MI:SS)
格式化数字:
TO_NUMBER
注: TO_CHAR 把日期或数字转换为字符串

TO_CHAR(number, '格式') 
TO_CHAR(salary, '$99,999.99') 
TO_CHAR(date, '格式')
TO_DATE  把字符串转换为数据库中的日期类型
TO_DATE(char, '格式')
TO_NUMBER  将字符串转换为数字 
TO_NUMBER(char, '格式')

返回系统日期:

SQL> select sysdate from dual;

SYSDATE
--------------
03-7月 -18
mi是分钟

SQL> select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS'
--------------------------------------
2018-07-03 11:15:59
mm会显示月份

SQL> select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;

TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MM:SS'
--------------------------------------
2018-07-03 11:07:39
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') from dual  ;

TO_CHAR(SYSDATE,'YY-MM-DDHH24:MI:S
----------------------------------
18-07-03 11:17:09

转换的格式:

表示 year 的:y 表示年的最后一位 、
                     yy 表示年的最后2位 、 
                     yyy 表示年的最后3位 、
                     yyyy 用4位数表示年

表示month的: mm 用2位数字表示月 、
                       mon 用简写形式, 比如11月或者nov 、
                       month 用全称, 比如11月或者november

表示day的:dd  表示当月第几天 、
                  ddd 表示当年第几天 、
                  dy  当周第几天,简写, 比如星期五或者fri 、
                  day 当周第几天,全称, 比如星期五或者friday

表示hour的:hh   2位数表示小时 12进制、 
                   hh24 2位数表示小时 24小时

表示minute的:mi 2位数表示分钟

表示second的:ss 2位数表示秒 60进制

表示季度的:q 一位数 表示季度 (1-4)

另外还有ww 用来表示当年第几周 w用来表示当月第几周。

24小时制下的时间范围:00:00:00-23:59:59
12小时制下的时间范围:1:00:00-12:59:59

数字格式:  9  代表一个数字 
               0  强制显示0 
               $  放置一个$符 
               L  放置一个浮动本地货币符 
               .  显示小数点 
               ,  显示千位指示符
当前时间减去7分钟的时间 
select sysdate,sysdate - interval '7' MINUTE from dual; 
当前时间减去7小时的时间 
select sysdate - interval '7' hour from dual; 
当前时间减去7天的时间 
select sysdate - interval '7' day from dual; 
当前时间减去7月的时间 
select sysdate,sysdate - interval '7' month from dual; 
当前时间减去7年的时间 
select sysdate,sysdate - interval '7' year from dual; 
时间间隔乘以一个数字 
select sysdate,sysdate - 8*interval '7' hour from dual;

含义解释:

  Dual伪列
      Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的select语句块中。
      不同系统可能返回日期的格式不一样。
      返回当前连接的用户:select user from dual;

1、上月末天:

SQL> select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd') LastDay from dual;

LASTDAY
--------------------
2018-06-30

2、上月今天

SQL> select to_char(add_months(sysdate,-1),'yyyy-MM-dd') PreToday from dual;

PRETODAY
--------------------
2018-06-03

3、上月首天

SQL> select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd') firstDay from dual;

FIRSTDAY
--------------------
2018-06-01

4、按照每周进行统计

SQL> select to_char(sysdate,'ww') from dual group by to_char(sysdate,'ww');

TO_C
----
27

5、按照每月进行统计

SQL> select to_char(sysdate,'mm') from dual group by to_char(sysdate,'mm');

TO_C
----
07

6、按照每季度进行统计

SQL> select to_char(sysdate,'q') from dual group by to_char(sysdate,'q');

TO
--
3

7、按照每年进行统计

SQL> select to_char(sysdate,'yyyy') from dual group by to_char(sysdate,'yyyy');

TO_CHAR(
--------
2018

8、要找到某月中所有周五的具体日期

SQL> select to_char(t.d,'YY-MM-DD') from (
  2  select trunc(sysdate, 'MM')+rownum-1 as d
  3  from dba_objects
  4  where rownum < 32) t
  5  where to_char(t.d, 'MM') = to_char(sysdate, 'MM') --找出当前月份的周五的日期
  6  and trim(to_char(t.d, 'Day')) = '星期五'
  7  ;

TO_CHAR(T.D,'YY-
----------------
18-07-06
18-07-13
18-07-20
18-07-27

如果把where to_char(t.d, 'MM') = to_char(sysdate, 'MM')改成sysdate-90,即为查找当前月份的前三个月中的每周五的日期。


相关博文:

发表新评论