为什么不会在TO_DATE返回我的查询的TIME部分?

时间:2015-10-12 11:16:10

标签: sql oracle epoch to-date to-char

我正在尝试将EPOCH转换为人类日期。

  • 当我在他们的网站上测试时,它会返回正确的值。
  • 当我在SQL Developer中执行此操作时,这是错误的。

这导致我检查其他基本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;
  

这应该返回:星期六,2011年12月31日00:00:00 GMT但它返回:   04-OCT-30

再次,TIME缺失。

SERVER在EST上,所以时间超过5小时 Oracle Server 11g 使用SQL DEveloper 4.0.2.15

感谢您的帮助, 本

4 个答案:

答案 0 :(得分:2)

Mask也应该在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)

答案 1 :(得分:2)

  

它错过了时间?

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

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

在个人SQL级别,要以所需格式显示日期,请始终使用 TO_DATE 以及正确的 FORMAT MODEL

例如,

会话级

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

答案 2 :(得分:0)

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

来自this answer

  

您可以在偏好设置中更改此内容:

     
      
  1. 从Oracle SQL Developer的菜单转到:工具>偏好。
  2.   
  3. 从“首选项”对话框中,选择“数据库”>左侧面板中的NLS。
  4.   
  5. 从NLS参数列表中,在日期格式字段中输入DD-MON-RR HH24:MI:SS
  6.   
  7. 保存并关闭对话框,完成!
  8.   

(我更喜欢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 

答案 3 :(得分:0)

您的纪元包含毫秒,您需要将其除以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;