INSERT INTO DELLL (
DATETIMEMY)
SELECT to_date(to_char(SU_MODIFYDATE, 'YYYY/MM/DD'),'YYYY/MM/DD') AS DATETIMEMY
FROM SER_TBLSERVICES WHERE SVE_SERVICEID=422
SU_MODIFYDATE = 01/18/2013
但插入 DELLL 日期 (DATETIMEMY) 格式后仍然相同
日期时间我 = 01/18/2013
您没有为DATE
. 它们在内部存储为数字,没有格式。当您要选择日期时,格式就会出现。所以在你的情况下,你应该这样做:
首先只需按原样插入日期,不要尝试将其转换为 char 并再次返回:
SQL> INSERT INTO DELLL (
2 DATETIMEMY) SELECT SU_MODIFYDATE
3 FROM SER_TBLSERVICES WHERE SVE_SERVICEID=422;
1 row created.
现在要以特定格式选择它,您可以使用TO_CHAR
它来格式化它。
SQL> select * from delll;
DATETIMEMY
----------
01/18/2013 <-- which isn't what you want to see, you wanted to see yyyy/mmm/dd. so...
SQL> select to_char(DATETIMEMY,'yyyy/mm/dd') DATETIMEMY from DELLL
2 /
DATETIMEMY
----------
2013/01/18
或者,要应用于该会话中具有date
数据类型的所有选择,您可以更改默认显示格式:
SQL> alter session set nls_date_format='yyyy/mm/dd';
Session altered.
SQL> select * from delll;
DATETIMEMY
----------
2013/01/18
您示例中的 INSERT 或 SELECT 不会修改日期的存储方式。当您选择日期时,日期会被格式化,使用您当前的连接格式首选项/区域设置。
您正在使用 TO_DATE,选择返回值与任何其他日期相同,它将根据区域设置进行格式化。
DazzaL 的回答是正确的,他讨论了日期的格式、存储和检索。
我想讨论一下您在代码中所做的事情。
Oracle 存储的日期精确到一秒。MM/DD/YYYY HH24:MI:SS
简单来说,您可以按格式检索日期。
通过发布to_date(to_char(SU_MODIFYDATE, 'YYYY/MM/DD'),'YYYY/MM/DD')
,您实际上是将日期截断为日期部分。因此,当您尝试检索此值时,该HH24:MI:SS
部分将具有00:00:00
,因为您已截断了日期。
如果您希望将所有详细信息(从年、月、日到小时、分钟和秒)SU_MODIFYDATE
插入到 in 的列中DELLL
,您应该使用
INSERT INTO DELLL (
DATETIMEMY)
SELECT SU_MODIFYDATE AS DATETIMEMY
FROM SER_TBLSERVICES WHERE SVE_SERVICEID=422
这将确保列中日期的所有部分SU_MODIFYDATE
都插入到新列中。
如果你想截断日期,例如,使用到分钟to_date(to_char(SU_MODIFYDATE, 'YYYY/MM/DD HH24:MI'),'YYYY/MM/DD HH24:MI')
同样,您可以根据您的选择将日期从年份部分截断到第二部分。
如果要插入截断的日期,则应使用已有的查询。如果要插入包含所有部分的日期,请避免使用to_char
and截断to_date
。