1
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

4

3 回答 3

2

您没有为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
于 2013-02-14T07:44:04.290 回答
0

您示例中的 INSERT 或 SELECT 不会修改日期的存储方式。当您选择日期时,日期会被格式化,使用您当前的连接格式首选项/区域设置。

您正在使用 TO_DATE,选择返回值与任何其他日期相同,它将根据区域设置进行格式化。

于 2013-02-14T07:10:52.997 回答
0

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_charand截断to_date

于 2013-02-14T09:18:15.927 回答