Heim >Datenbank >MySQL-Tutorial >oracle 日期转换格式 函数
1 oracle对时间格式的数据存贮 oracle数据库中存放时间格式的数据,是以oracle特定的格式存贮的,占7个字节,与查询时显示的时间格式无关,具体哪个字节表示什么,我不太清楚,请高手补充。存贮的时间包括年月日时分秒,最小精度为秒,不存贮秒以下的时间单
1 oracle对时间格式的数据存贮
oracle数据库中存放时间格式的数据,是以oracle特定的格式存贮的,占7个字节,与查询时显示的时间格式无关,具体哪个字节表示什么,我不太清 楚,请高手补充。存贮的时间包括年月日时分秒,最小精度为秒,不存贮秒以下的时间单位。因此在一些前台支持毫秒级的程序(如PB客户端程序)连接到 oracle数据库时应注意这点。查询时显示的时间格式,由会话环境决定,或者由用户定义,与数据库无关。
2 oracle时间显示形式
通常,客户端与数据库建立起连接后,oracle就会给一个缺省的时间格式数据的显示形式,与所使用的字符集有关。一般显示年月日,而不显示时分秒。例 如,使用us7ascii字符集(或者是其他的英语字符集)时,缺省的时间格式显示为:28-Jan-2003,而使用zhs16gbk字符集(或其他中 文字符集)时时间格式缺省显示为:2003-1月-28.向表中插入数据时,如果不使用转换函数,则时间字段的格式必须遵从会话环境的时间格式,否则不能 插入。查看当前会话的时间格式,可以使用以下的SQL语句:SQL> select sysdate from dual;(只能按照此语句的结果,才能插入数据)
3 向oracle表中插入时间格式的数据
向oracle表插入时间格式的数据是一个相对来讲比较麻烦的事情,要么你严格遵从当前会话的时间格式书写你的时间值,要么使用转换函数自定义时间数据的 格式。有两个与时间相关的转换函数:to_char 和 to_date .to_char(时间值,时间格式)函数将时间值转换为字符串形式,通常在查询中使用;to_date(字符串,时间格式)则把格式字符串转换时间值, 通常在insert 语句中使用。(呵呵,程序中没这样做,所以出错)在日期格式中,各种日期格式分量这里不作详细的讨论,请查oracle帮助文档中这两个函数的用法,或者 查一查PL/SQL编程的书,讲得很详细的。
4 如何修改会话中的日期格式
修改当前会话中的日期格式据说有三种办法,我只做过前两种办法的试验,修改glogin.sql文件的办法我没有试过,不知道是不是真的能行。下面一一解说。
(1) 在sql*plus中修改当前会话的日期格式SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';将当前会话的时间格式修改为这种格式: 2003-01-28 15:23:38,即四位年-两位月-两位日,空格,24小时的制的小时:分钟:秒。
这种修改方法,只对当前会话有效。注意,是对当前会话,而不是当前的sql*plus窗口。即如果你这样修改之后,又使用connect命令以其他用户连接到数据库或者是连接到其他的数据库,则这个日期格式就失效了,又恢复到缺省的日期格式。
(2) 修改注册表(只对windows系统)
在注册表hkey_local_machinesoftwareoraclehome0主键中增加一个字串(8i版本,9i也可以),字串名为 nls_date_format,字串的值为你希望定义的时间格式,如: yyyy-mm-dd hh24:mi:ss ,然后重新启动sql*plus.这种修改方法,对sql*plus窗口有效,即不论你打开多少个sql*plus窗口,缺省的都是这种时间格式。修改服 务器端的注册表无效,只有修改客户端的注册表才有效。
unix系统下有没有这类似的方法,我不知道,我不会用unix或者是linux系统。
(3) 修改$oracle_homesqlplusadmin目录中glogin.sql文件这种方法我没有试过,不敢乱说,以免误导大家。请了解这种方法的高手来指教。
5 日期格式的优先级
如果在一个具体的环境中,既修改了注册表,又使用alter session命令修改了当前会话,那么哪一种修改方法有效呢?alter session命令有效,它的优先级是最高的。即不管当前的客户端环境是什么样的,注册表修改成什么样子了,只要你使用了alter session命令来修改了时间格式,那么就以你修改后的时间格式为准。
因此,如果直接使用sql*plus交互式查询或插入时间格式的数据,两种方法都可以用。如果使用sql文件来进行批量的插入或者是定时执行,最好在使用 时间数据前使用alter session命令来修改会话,以保证这个sql语句的正常运行与环境无关。同样的,如果是前台的客户端程序中需要使用到时间格式的数据,最好也在使用之 前修改会话,或者使用to_char或to_date函数进行转换(强烈推荐使用转换函数),以保证程序运行与环境无关。
ADD_MONTHS(d,n) 用于返回特定日期时间d之后(或之前)的n个月所对应的日期时间(n为正整数表示之后)
CURRENT_DATE 用于返回当前会话时区所对应的日期时间
CURRENT_TIMESTAMP 用于返回当前会话时区的日期时间
DBTIMESONE 用于返回数据库所在时区
EXTRACT 用于从日期时间值中取得所需的特定数据(如取得年份,月份等) SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL
FROM_TZ 用于将特定时区的TIMESTAMP值转变为TIMESTAMP WITH TIME ZONE 值
LAST_DAY(d) 用于返回特定日期所在的月份的最后一天
LOCALTIMESTAMP 用于返回当前会话时区的日期时间
MONTHS_BETWEEN(d1,d2) 用于返回日期d1和d2之间相差的月数.如果d1小于d2返回负数.如果d1,d2和天数相同或都是月底 ,则返回整数,否则ORACLE以每月31天为准来计算结果的小数部分.
NEW_TIME(date,zone1,zone2) 用于返回时区一的日期时间所对应的时区二的日期时间
NEXT_DAY(d,char) 用于返回指定日期后的第一个工作日(由char指定)所对应的日期 select next_day(sysdate,'月曜日') from dual
NUMTODSINTERNAL(n,char_expr)用于将数字n转换为INTERVAL DAY TO SECOND 格式,其中char_expr可以是DAY,HOUR,MINUTE或SECOND
NUMTOYMINTERNAL(n,chr_expr) 用于将数字n转换为INTERVAL YEAR TO MONTH格式,其中可以是YEAR或MONTH
ROUND(d,[,fmt]) 用于返回日期时间的四舍五入结果,如果fmt指定年度,则7月1为分界线 如果fmt指定月,则16日为分界线,如果指定天,则中午12:00为分界线.
SESSIONTIMEZONE 用于返回当前会话所在的时区.
SYS_EXTRACT_UTC(datetime_whit_timezone) 用于返回特定时区时间所对应的格林威治时间
SYSDATE 返回当前系统的日期时间 SYSTIMESTAMP返回当前系统的日期时间及时区
TO_DSINTERNAL(char[,'nls_param']) 用于将符合特定日期和时间格式的字符串转变为INTERVAL DAY TO SECOND 类型
TO_TIMESTAMP(char[fmt[,'nls_param']]) 将符合特定日期和时间格式的字符串转变为TIMESTAMP类型
TO_TIMESTAMP_TZ(char[fmt[,'nls_param']]) 将符合特定日期和时间格式的字符串转变为TIMESTAMP WITH TIME ZONE类型
TO_YMINTERNAL(char) 将字符串转变为INTERVA YEAR TO MONTH类型
TRUNC(d,[fmt]) 截断日期时间数据,如果fmt指定年度,则结果为本年度的一月一日,如果指定月,则结果为本月一日
TZ_OFFSET(time_zone_name||SESSIONTIMEZONE||DBTIMEZONE) 返回特定时区与UTC(格林威治)相比的时区偏移
Oracle date format
With the functions to_char and to_date, a date format can be used. Example:
select to_char(sysdate,'DD/MM/YYYY HH24:MI:SS') from dual;
will return something like: 24/03/2006 14:36:43
Here is a list of all the formats that can be used:
Format mask | Description |
---|---|
CC | Century |
SCC | Century BC prefixed with - |
YYYY | Year with 4 numbers |
SYYY | Year BC prefixed with - |
IYYY | ISO Year with 4 numbers |
YY | Year with 2 numbers |
RR | Year with 2 numbers with Y2k compatibility |
YEAR | Year in characters |
SYEAR | Year in characters, BC prefixed with - |
BC | BC/AD Indicator * |
Q | Quarter in numbers (1,2,3,4) |
MM | Month of year 01, 02...12 |
MONTH | Month in characters (i.e. January) |
MON | JAN, FEB |
WW | Weeknumber (i.e. 1) |
W | Weeknumber of the month (i.e. 5) |
IW | Weeknumber of the year in ISO standard. |
DDD | Day of year in numbers (i.e. 365) |
DD | Day of the month in numbers (i.e. 28) |
D | Day of week in numbers(i.e. 7) |
DAY | Day of the week in characters (i.e. Monday) |
FMDAY | Day of the week in characters (i.e. Monday) |
DY | Day of the week in short character description (i.e. SUN) |
J | Julian Day (number of days since January 1 4713 BC, where January 1 4713 BC is 1 in Oracle) |
HH | Hournumber of the day (1-12) |
HH12 | Hournumber of the day (1-12) |
HH24 | Hournumber of the day with 24Hours notation (1-24) |
AM | AM or PM |
PM | AM or PM |
MI | Number of minutes (i.e. 59) |
SS | Number of seconds (i.e. 59) |
SSSSS | Number of seconds this day. |