to_char与to_date转换问题

izj 2012-04-24 12:23:01
今天做oracle数据库更新的时候,Last_date 数据库定义类型为Date.如果传入的日期参数为null,则Last_date = oracle系统时间。格式要求 年/月/日 时:分:秒.实现过程中出现问题了。

尝试1:

to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') -- 值为 2012/4/23 19:20:34

to_date(to_char(sysdate,'yyyy/mm/dd hh24:mi:ss'),'yyyy/mm/dd hh24:mi:ss') --输出值为 2012-4-23

问题1: to_date之后日期格式为何不是'yyyy/mm/dd hh24:mi:ss',时分秒去哪儿了?
问题2: 输出的2012-4-23?为何不是我指定是 'yyyy/mm/dd' 格式


尝试2:

完整的sql是这样的
insert into
table(
a,
b,
c
)values (
&a,
&b,
nvl(&c,sysdate) -- 此处nvl会截掉时分秒。在pl/sql中运行通过有时分秒,但在程序中和框架搭配一起用,时分秒被 截掉了,为什么。
)


尝试3:

decode(&c,null,sysdate,&c)
经测试,通过。


在此请教给位前辈了。。。
...全文
1022 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaodan2000 2012-04-27
  • 打赏
  • 举报
回复
开发中用date类型是不能存储时分秒的,框架中需要用时间戳类型进行存储
buryMyLove 2012-04-27
  • 打赏
  • 举报
回复
date类型,有一个默认的格式,只要你是以date类型来存储的,就是这个格式,可以改,11楼已经说的很清楚了,我觉得to_date(*****,'格式')不是把*****转换成某格式的date类型数据,而是按照某格式改成date类型数据
izj 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

1、
SQL> select sysdate from dual;

SYSDATE
--------------
25-4月 -12

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

TO_CHAR(SYSDATE,'YY
-------------------
2012-04-25 22:……
[/Quote]

这句SQL> select to_date(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:m
i:ss') from dual; -- 结果输出 2012/04/26 11:11:48
和 select sysdate from dual ; --结果输出 2012/04/26 11:11:48

在我的PL/sql中不进行alter nls_date_formart 也可以出来结果的。但我在框架中执行
insert into
table(
a,
b,
c
)values (
&a,
&b,
nvl(&c,to_date(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'))
之后。插入数据库中的数据就没时分秒。

于是, 我这样写。alter nls_date_formart(我的PL/sql修改不鸟nls_date_formart) ,修改过注册表(出重启过pl/sql,重启过电脑)。时分秒出不来。

declare
begin
dbms_output.put_line(to_date(to_char(sysdate,'yyyy/mm/dd hh24:mi:ss'),'yyyy/mm/dd hh24:mi:ss') );
end;

控制台
-----
12-04-26

我郁闷了。。。求解阿。我说的是不是有点复杂阿。。。


langWf 2012-04-26
  • 打赏
  • 举报
回复
用to_char格式化时间,to_date用来显示时间不会进行格式化
izj 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

1、
SQL> select sysdate from dual;

SYSDATE
--------------
25-4月 -12

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

TO_CHAR(SYSDATE,'YY
-------------------
2012-04-25 22:……
[/Quote]

今天试过您的方法。
这句话 alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss'; 在我的PL/sql version7.0.3 中执行无效的错误,如果改为alter system set .. 就报alter system 的选项无效的错。
去查了下,又试了 alter system set nls_date_format = 'yyyy-mm-dd hh24:mi:ss' scope=spfole.貌似也报同样的错。不知道您上面的语句是怎么执行成功的呢?

另外。我的操作系统所日文version.PL/SQL也是日文的。config --user interface 对应的日文没找到呢,又在工具-选项中找了个遍,也没找到呢,能麻烦说的更详细些吗
zjz8204 2012-04-26
  • 打赏
  • 举报
回复
只是一个时间格式显示的问题,楼主担心的太多了。
jdsnhan 2012-04-26
  • 打赏
  • 举报
回复
alter session 是更改本次session的。断开连接就无效了。如果想长期有效,用系统级的命令
alter system
izj 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
1、
SQL> select sysdate from dual;

SYSDATE
--------------
25-4月 -12

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

TO_CHAR(SYSDATE,'YY
-------------------
2012-04-25 22:3……
[/Quote]

11和13楼是高手。膜拜。。
按照2位说的。问题是可以解决了。不过还有个疑问想请教一下
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
这条语句是执行一次之后,以后所有的日期格式会话都是'yyyy-mm-dd hh24:mi:ss'吗?
关掉PL/SQL再次打开,sysdate还仍然是这个'yyyy-mm-dd hh24:mi:ss'格式吗?
jdsnhan 2012-04-25
  • 打赏
  • 举报
回复
1、
SQL> select sysdate from dual;

SYSDATE
--------------
25-4月 -12

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

TO_CHAR(SYSDATE,'YY
-------------------
2012-04-25 22:30:22

SQL> select to_date(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:m
i:ss') from dual;

TO_DATE(TO_CHA
--------------
25-4月 -12

SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';

会话已更改。

SQL> select to_date(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:m
i:ss') from dual;

TO_DATE(TO_CHAR(SYS
-------------------
2012-04-25 22:30:39

SQL> select sysdate from dual;

SYSDATE
-------------------
2012-04-25 22:31:20

SQL>


2、在plsql中,config--user interface --NLS option 可以设置在plsql中日期时间的显示格式。仅生效在plsql中
izj 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
客户端与数据库建立起连接后,oracle就会给一个缺省的时间格式数据的显示形式,与所使用的字符集有关。一般显示年月日,而不显示时分秒。
(1) 在sql*plus中修改当前会话的日期格式
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
将当前会话的时间格式修改为这种格式: 2003-01-28 15:23:3……
[/Quote]

谢谢您的经验之谈.不过
我用的是windows 系统。不过开发工具用的是PL/SQL . 和Sql*plus 有点不一样呢
半亩方塘立身 2012-04-25
  • 打赏
  • 举报
回复
客户端与数据库建立起连接后,oracle就会给一个缺省的时间格式数据的显示形式,与所使用的字符集有关。一般显示年月日,而不显示时分秒。
(1) 在sql*plus中修改当前会话的日期格式
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
将当前会话的时间格式修改为这种格式: 2003-01-28 15:23:38,即四位年-两位月-两位日,空格,24小时的制的小时:分钟:秒。
(2) 修改注册表(只对windows系统)
在注册表/hkey_local_machine/software/oracle/home0主键中增加一个字串(8i版本),字串名为nls_date_format,字串的值为你希望定义的时间格式,如: yyyy-mm-dd hh24:mi:ss ,然后重新启动sql*plus。
这种修改方法,对sql*plus窗口有效,即不论你打开多少个sql*plus窗口,缺省的都是这种时间格式。修改服务器端的注册表无效,只有修改客户端的注册表才有效。
unix系统下有没有这类似的方法,我不知道,我不会用unix或者是linux系统。
izj 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
如果本身是一个带有时分秒的日期类型,那么肯定不会丢的,
楼主所看到的丢是怎么看到的?
是通过程序debug看到的?还是通过oracle工具看到的?
这个其实是你debug时的表示问题,时分秒肯定还在,不会丢的!
不信的话,楼主可以用select to_char(date,'yyyy/mm/dd hh24:mi:ss') 的形式查询下你更新的字段,看下有没有时分秒!

如果楼主非要看到时……
[/Quote]

在Pl/sql中,进行尝试1,插入数据时。时分秒看不到。去试试您说的 select to_char(date,'yyyy/mm/dd hh24:mi:ss')不过就算这样时分秒可以看到,但我想让时分秒显示的表示啊,而不是2012/4/23。

做开发的。数据库定义不能改,你懂的。
尝试过timestamp。这个会带有时间戳。采用substr也截取过字符串,然后在将其to_date.昨天试过了的,好像不行,今天在去试试看



izj 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
应用程序中是什么语言,要用带时分秒的数据类型,否则会截断。
再有就是,直接查询出带时分秒的字符串,然后在程序中用String保存,再进行自己的处理。
[/Quote]

开发语言java。java.util.Date date = null; 传入日期date。

查询出带时分秒的字符串之后,在更新数据库时,时间就跟当前oracle时间对不上,有时差了。
所以,必须在sql语句中做日期为空的判断,并且将带时分秒的日期插入进去。
lxyzxq2008 2012-04-24
  • 打赏
  • 举报
回复
如果本身是一个带有时分秒的日期类型,那么肯定不会丢的,
楼主所看到的丢是怎么看到的?
是通过程序debug看到的?还是通过oracle工具看到的?
这个其实是你debug时的表示问题,时分秒肯定还在,不会丢的!
不信的话,楼主可以用select to_char(date,'yyyy/mm/dd hh24:mi:ss') 的形式查询下你更新的字段,看下有没有时分秒!

如果楼主非要看到时分秒,建议楼主可以把类型改成timestamp类型,这样你在debug的时候就可以看到时分秒了!
izj 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
要格式用to_char
[/Quote]

请看完贴在回复,谢谢
izj 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
想输入-的时间格式 偏成/ 想输出/偏偏输出- 玩多了就知道其中的意思了
[/Quote]

是这个调调吗,我去试试
izj 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
to_date之后是个date类型

date类型 永远有年月日时分秒,所谓的“没有”没显示出来。

想要格式用to_char
[/Quote]

对。您说的没错。但结合我上面的情况。就没有了时分秒。您试试我上面的代码就知道了
  • 打赏
  • 举报
回复
想输入-的时间格式 偏成/ 想输出/偏偏输出- 玩多了就知道其中的意思了
forgetsam 2012-04-24
  • 打赏
  • 举报
回复
to_date之后是个date类型

date类型 永远有年月日时分秒,所谓的“没有”没显示出来。

想要格式用to_char
我心飞翔 2012-04-24
  • 打赏
  • 举报
回复
应用程序中是什么语言,要用带时分秒的数据类型,否则会截断。
再有就是,直接查询出带时分秒的字符串,然后在程序中用String保存,再进行自己的处理。
加载更多回复(1)

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧