oracle 日期类型是什么,oracle date日期类型 精析

本文详细介绍了Oracle数据库中日期时间的处理,包括date类型的存储与展示格式、字符串与日期的转换方法,以及如何根据日期查询数据。重点讨论了查询某一天和指定时间段的数据的正确SQL写法,强调了在日期比较时的注意事项,提供了多种查询示例和错误示例进行对比分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、date

1.date、sysdate格式说明

展示

date类型,展示格式既可以为:YYYY/MM/DD,也可以为YYYY/MM/DD HH24:MI:SS;

其存储格式只有一种:YYYY/MM/DD HH24:MI:SS

展示格式一:

当你只存年月日时,date实际存储的是:年月日0时0分0秒,在plsql中,其展示格式为:YYYY/MM/DD,

将其转换成YYYY/MM/DD HH24:MI:SS时,返回的是YYYY/MM/DD 00:00:00。

展示格式二:

当date实际存储的是年月日时分秒时,在plsql中,其展示格式为:YYYY/MM/DD HH24:MI:SS;

系统时间sysdate,在plsql中,其展示格式为:YYYY/MM/DD HH24:MI:SS。

说明:与插入时的格式无关

证实

TESTDATE表结构

6819716dee5df38e33067f162dc438b3.png

插入sql的日期格式及结果展示

9a9582a200c2774942a63cb4653e719e.png

补充:

当插入年月日时分秒且时分秒为:00:00:00,在plsql中是不显示时分秒的。

d875586f9dca79ebd27efd57455aa382.png

要想显示出来,需用to_char()

2ebff0490f4b7f7f8fbd5fc03a371d90.png

若是还是对推荐有疑问,请看下面的 4.2 查询指定时间段的数据

2.日期转字符串

TO_CHAR(date,format)

方式一:只带一个参数

select to_char(t.schedule_date) from CONSULT_SCHEDULE t

--28-APR-17

方式二:带2个参数

转换格式不区分大小写;

7c4cc6299a762cbe99cdbcc231b028dd.png

小时格式化:不带24时,默认为12小时制,24小时格式转换时需要指明;

8ee122f2ec69cab4eab81da0ba3accf6.png

分钟格式化:可以使用mi或mm,建议使用MI。

44368f71acc8d22a94224c1d329a1817.png

说明:

格式化成yyyy年mm月dd日

--年月日

--需要填充3个空格,不然‘日’显示不出来

SELECT TO_CHAR(SYSDATE,'yyyy"年"MM"月"dd"日" ') 系统日期 FROM DUAL

15fc07599bac5308252e0a433146054e.png

注意:

年月日需加上双引号;

别名不能加单引号、双引号。

3.字符串转日期

方法一:

TO_DATE('dateStr', format),规则如下:

转换格式不区分大小写;

小时格式化:不带24时,默认为12小时制,24小时格式转换时需要指明;

分钟格式化:必须使用mi,不能使用mm,否则会报错;

dateStr的长度<=format的长度,都可以实现类型转换:

方式一:标准格式

年月日

5a39e10d54a81b0c9be154f094b1ca92.png

说明:

年月日时分秒

32f27a614b03e3a3381bd9009d18e96e.png

方式二:字符串只到分,会自动添加上:00秒。

89ff03dc06f354272f98aa6d97c2f9f5.png

方式三:字符串也是只到日

f16f358025d520cdde0db95559924d9d.png

方法二:

DATE'YYYY-MM-DD',并且只能是这一种格式。

19f361931fae30302f2b22f096498506.png

另外,TO_DATE(date),该函数也可以只传一个参数,但是这个参数必须是date类型,

表示的含义是:将任何格式的日期类均转换成YYYY/MM/DD的格式。

bbbea5a14e4ee2e78cc96b46d9010987.png

4.根据日期查询数据

说明:这里着重介绍的是日期字段带有时分秒的

4.1 查询某一天的数据

测试环境:

VIRTUAL_CARD表中共有5条记录;

字段REGTIME的字段类型为date。

a6e5b4cd6a6cca10a180cae07e7306a0.png

情景模拟:查询2018年7月18日的数据记录

格式要求:日期转变成YYYY-MM-DD HH24:MI:SS格式的字符串

方式一:查询条件使用字符串实现

--查询条件按字符串进行

SELECT TO_CHAR(T.REGTIME, 'YYYY-MM-DD HH24:MI:SS') REGTIME

FROM VIRTUAL_CARD T

WHERE TO_CHAR(T.REGTIME, 'yyyy-mm-dd') = '2018-07-18'

方式二:查询条件使用日期实现

方法一:TRUNC()

--查询条件按日期进行1

SELECT TO_CHAR(T.REGTIME, 'YYYY-MM-DD HH24:MI:SS') REGTIME

FROM VIRTUAL_CARD T

WHERE TRUNC(T.REGTIME) = TO_DATE('2018-07-18', 'YYYY-MM-DD')

方法二:TO_DATE()

--查询条件按日期进行2

SELECT TO_CHAR(T.REGTIME, 'YYYY-MM-DD HH24:MI:SS') REGTIME

FROM VIRTUAL_CARD T

WHERE TO_DATE(T.REGTIME) = TO_DATE('2018-07-18', 'YYYY-MM-DD')

方式三:利用TO_DATE()特性

SELECT TO_CHAR(T.REGTIME, 'YYYY-MM-DD HH24:MI:SS') REGTIME

FROM VIRTUAL_CARD T

WHERE T.REGTIME >= TO_DATE('2018-07-18', 'YYYY-MM-DD')

AND T.REGTIME < TO_DATE('2018-07-19', 'YYYY-MM-DD')

方法四:TO_CHAR()-->TO_DATE() 不建议使用

SELECT TO_CHAR(T.REGTIME, 'YYYY-MM-DD HH24:MI:SS') REGTIME

FROM VIRTUAL_CARD T

WHERE TO_DATE(TO_CHAR(T.REGTIME, 'YYYY-MM-DD'), 'YYYY-MM-DD') =

TO_DATE('2018-07-18', 'YYYY-MM-DD')

查询结果展示

cd1436bb39a571ee784edded6c426b4c.png

updateTime--2018年8月15日10点21分

4.2 查询指定时间段的数据

表数据展示

f6126b592586223056e465f2abcbc75b.png

场景:查询从2018-08-05至2018-08-06的数据

错误实现方式:

--错误实现:between and

SELECT REGTIME

FROM VIRTUAL_CARD

WHERE REGTIME BETWEEN TO_DATE('2018-08-05', 'yyyy-mm-dd') AND

TO_DATE('2018-08-07', 'yyyy-mm-dd')

ORDER BY REGTIME

查询结果:[2018/08/05 00:00:00,2018/08/07 00:00:00]

48d50f4b383427704359fe8c80acc348.png

方式一:

--方式一:[2018/08/05 00:00:00,2018/08/06 23:59:59]

SELECT REGTIME

FROM VIRTUAL_CARD

WHERE REGTIME >= TO_DATE('2018-08-05', 'yyyy-mm-dd') AND

REGTIME < TO_DATE('2018-08-07', 'yyyy-mm-dd')

ORDER BY REGTIME

3dc149aaad998e1ce840b36dee10cebd.png

方式二:推荐使用

--方式二:[2018/08/05 00:00:00,2018/08/07 00:00:00)

SELECT REGTIME

FROM VIRTUAL_CARD

WHERE REGTIME >= TO_DATE('2018-08-05', 'yyyy-mm-dd') AND

REGTIME < TO_DATE('2018-08-06', 'yyyy-mm-dd') + 1 --2018-08-07

ORDER BY REGTIME

a338d04c349ba39728a11653f5abf349.png

方式三:

--方式三

SELECT REGTIME

FROM VIRTUAL_CARD

WHERE REGTIME >= TO_DATE('2018-08-05 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND

REGTIME <= TO_DATE('2018-08-06 23:59:59', 'yyyy-mm-dd hh24:mi:ss')

ORDER BY REGTIME

f4838c21f9858e2c01d1a8714e7f7236.png

5.date类型进行加减运算

二、timestamp

1.格式

--查询系统时间戳

SELECT SYSTIMESTAMP FROM DUAL

8fd14c10b28d284a2b595fe01a180630.png

三、相互转换

1.日期转时间戳

--系统时间转时间戳

SELECT CAST(SYSDATE AS TIMESTAMP) DATE_TO_TIMESTAMP FROM DUAL

1837f123939b4f4e090beae6a2b1e1db.png

写在最后

哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值