ORACLE中的TO_DATE函数

时间:2017-01-26 11:27:12

标签: oracle date

我正在尝试TO_DATE功能。具体来说,我注意到以下查询

1. SELECT TO_CHAR(TO_DATE('01-01-2015','DD-MM-YYYY'),'DD-MON-YY') FROM DUAL
2. SELECT TO_DATE('01-01-2015','DD-MM-YYYY') FROM DUAL

具有相同的输出:01-JAN-2015

为什么TO_DATE函数以缩写形式返回月份? 我对第二个查询的预期输出类似于01-01-2015(简单地说,是TYPE转换,而不是格式转换)。

我错了吗?

由于

4 个答案:

答案 0 :(得分:4)

日期没有格式 - 它们由7- or 8-bytes表示。

Typ=13 Len=8: 220,7,11,26,16,41,9,0

可能输出:

TO_CHAR()

此格式对于计算机比较日期非常有用,但对人们没那么有用;因此,当SQL客户端(SQL / plus,SQL Developers,TOAD等)显示日期时,它不会显示字节,而是将其显示为字符串。

它通过对NLS_DATE_FORMAT(或其他一些字符串化日期的内部方法)进行隐式调用并使用默认格式掩码来执行此转换来实现此目的。

SQL / Plus和SQL Developer将使用用户的会话参数SELECT TO_CHAR( TO_DATE('01-01-2015','DD-MM-YYYY'), ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ) FROM DUAL 来执行此转换 - 请参阅this answer

所以你的第二个查询被隐式转换为做一些接近这个的事情(但几乎可以肯定,更有效率):

$db['default'] = array
(
    'dsn'   => 'sqlsrv:server=127.0.0.1,1433;Database=mydb',
    'username' => 'myuser',
    'password' => 'mypass',
    'dbdriver' => 'pdo',
    ...
);

答案 1 :(得分:2)

DATE值的默认输出格式,resp TO_DATE()函数由NLS_DATE_FORMAT值设置。您可以使用此查询进行验证:

SELECT * 
FROM V$NLS_PARAMETERS 
WHERE PARAMETER = NLS_DATE_FORMAT';

您可以在会话级别更改它,例如使用

alter session set NLS_DATE_FORMAT = 'DD-MM-YYYY';

答案 2 :(得分:0)

TO_CHAR的输出格式不正确,请尝试:

SELECT TO_CHAR(TO_DATE('01-01-2015','DD-MM-YYYY'),'DD-MM-YYYY') FROM DUAL;

答案 3 :(得分:0)

Oracle TO_DATE:用于将字符串转换为日期格式。

并与您的关注有关;您需要像下面那样更改会话:

alter session set nls_date_format='DD-MM-YYYY'

在连接后立即在您的应用中

现在,如果您再次运行查询:

SELECT TO_DATE ('01-01-2015', 'DD-MM-YYYY')
FROM DUAL;

结果将符合预期:

2015年1月1日

希望会有所帮助。