我正在尝试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转换,而不是格式转换)。
我错了吗?
由于
答案 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日
希望会有所帮助。