为什么 TO_DATE return 我的查询的 TIME 部分没有?

Why wont TO_DATE return the TIME section of my query?

我正在尝试将 EPOCH 转换为 HUMAN DATETIME。

这让我检查其他基本 SQL 以了解它们是如何返回的,

select sysdate from dual = 12-OCT-2015

时间不对?

SELECT TO_CHAR(TO_DATE('2015/05/15 8:30:25', 'YYYY/MM/DD HH:MI:SS'))
FROM dual; 

= 15-MAY-15 

又错过时间了?

SELECT TO_DATE('2015/05/15 8:30:25', 'YYYY/MM/DD HH:MI:SS')
FROM dual; 

= 15-MAY-15 

没有TO_CHAR,还缺时间。

然后是我的 EPOCH SQL,

SELECT TO_DATE('01/01/1970 00:00:00','DD/MM/YYYY HH24:MI:SS')+(1325289600000/60/60/24) AS EPOCH FROM dual;

This should return: Sat, 31 Dec 2011 00:00:00 GMT but it returns: 04-OCT-30

同样,缺少 TIME。

服务器在美国东部标准时间,所以时间还有 5 小时 甲骨文服务器 11g 使用 SQL 开发者 4.0.2.15

感谢您的帮助, 本

掩码也应该在TO_CHAR函数中以输出时间。

SELECT TO_CHAR(TO_DATE('2015/05/15 8:30:25', 'YYYY/MM/DD HH:MI:SS'), 'YYYY/MM/DD HH:MI:SS')
FROM dual;

但是会是字符串。如果你想用这个日期做一些事情(添加一些东西等等),你应该把 TO_CHAR 最后(首先用日期做所有事情,然后把 TO_CHAR 和掩码)

它 returns 是正确的值,但 SQL 开发人员未设置为正确显示它。

来自this answer

You can change this in preferences:

  1. From Oracle SQL Developer's menu go to: Tools > Preferences.
  2. From the Preferences dialog, select Database > NLS from the left panel.
  3. From the list of NLS parameters, enter DD-MON-RR HH24:MI:SS into the Date Format field.
  4. Save and close the dialog, done!

(我更喜欢 ISO 标准格式 YYYY-MM-DD HH24:MI:SS,但你喜欢哪个都行。)

那么如果你这样做:

SELECT TO_DATE('01/01/1970 00:00:00','DD/MM/YYYY HH24:MI:SS')
         +(1325289600000/60/60/24) AS EPOCH
FROM dual;

DD-MON-RR HH24:MI:SS 格式的输出将是:

EPOCH            
------------------
04-OCT-30 00:00:00 

YYYY-MM-DD HH24:MI:SS 的输出为:

EPOCH             
-------------------
4030-10-04 00:00:00 

Its missing the time?

不,它在那里,你只是没有展示它。或者您的客户端特定于区域设置的 NLS 设置未正确设置为显示时间部分。

日期总是包含日期和时间部分,由 Oracle 在内部以 7 字节专有格式存储。

在个人 SQL 级别,要以您想要的格式显示日期,请始终使用 TO_DATE 以及正确的 FORMAT型号.

例如,

会话级别

SQL> alter session set nls_date_format='YYYY-MM-DD';

Session altered.

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
----------
2015-10-12

SQL> alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';

Session altered.

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2015-10-12 17:08:18

个人 SQL 级别 将覆盖会话和客户端的 NLS 设置:

SQL> SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') FROM DUAL;

TO_CHAR(SYSDATE,'YY
-------------------
2015/10/12 17:09:58

你的epoch包括毫秒,你需要除以1000:

SELECT TO_DATE('01/01/1970 00:00:00','DD/MM/YYYY HH24:MI:SS')
         +(1325289600000/1000/60/60/24) AS EPOCH
FROM dual;