TO_CHAR 和 TO_DATE 给出不同的 results.How 以使用 TO_DATE 实现 TO_CHAR 功能?
TO_CHAR and TO_DATE giving different results.How to achieve the TO_CHAR functionality using TO_DATE?
SELECT TO_CHAR((select logical_date -1 from logical_date
where logical_date_type='B'),'DD/MM/YYYY HH24:MI:SS') FROM DUAL;
这个查询returns23/04/2016 00:00:00
o/p of select logical_date -1 from logical_date where logical_date_type='B' :4/23/2016
SELECT TO_DATE((select logical_date -1 from logical_date
where logical_date_type='B'),'DD/MM/YYYY HH24:MI:SS') FROM DUAL;
这个查询 returns 4/23/0016
.
如何使用 TO_DATE 获得 TO_CHAR 给出的格式??
此问题与您在 oracle 客户端设置中配置的会话的默认日期格式有关
检查您的 Session
的 NLS_DATE_FORMAT 设置
SELECT value
FROM nls_session_parameters
WHERE parameter = 'NLS_DATE_FORMAT'
您可以通过以下方式更改会话的此设置以获得所需的结果:
alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS';
日期没有任何固有格式。 Oracle 有一个内部表示,它看起来不像任何您认为是日期的东西。客户端或应用程序决定如何显示日期(例如使用 NLS_DATE_FORMAT),或者您可以使用 TO_CHAR
将日期转换为具有您指定格式的字符串,就像您在第一个例如。
在你的第二个例子中,你正在使用你的 NLS 设置将你的实际日期隐式转换为一个字符串 - 在此过程中失去了世纪,所以大概是 YY 而不是 YYYY - 然后你将它转换回来约会。当您交换月份和日期位置时,我很惊讶它没有出错。
不要那样做。转换为字符串并返回日期是没有意义的,即使您的设置不会在途中丢失信息。
如果您希望它作为客户端或其他进程使用的日期,只需执行以下操作:
select logical_date -1
from logical_date
where logical_date_type='B'
如果您想与另一个日期进行比较,则仍将其保留为日期:
select other_columns
from logical_date
where logical_date_type='B'
and logical_date -1 < sysdate
如果要指定格式 用于显示 然后使用:
select to_char(logical_date -1, 'DD/MM/YYYY')
from logical_date
where logical_date_type='B'
How do I get the format given by TO_CHAR using TO_DATE ?
首先,DATE没有任何格式。 Oracle 不会以您看到的格式存储日期。它在内部将其存储在 7 个字节 中,每个字节存储 datetime 值的不同组成部分。
Byte Description
---- -------------------------------------------------
1 Century value but before storing it add 100 to it
2 Year and 100 is added to it before storing
3 Month
4 Day of the month
5 Hours but add 1 before storing it
6 Minutes but add 1 before storing it
7 Seconds but add 1 before storing it
格式仅用于显示目的。 TO_DATE用于将文字转为日期,与格式化无关。要以您想要的格式显示日期,请使用 TO_CHAR 和适当的 FORMAT MODEL。
此外,请记住,格式具有 优先顺序:
让我们看看时间顺序,即从最高到最低:
在个人使用TO_CHAR或TO_DATE SQL声明
ALTER SESSION SET NLS_DATE_FORMAT=’whatever format model you want’;
在客户端机器
上将其设置为OS环境变量
NLS_DATE_FORMAT
的设置在数据库初始化参数
例如,
个人SQL声明:
SQL> SELECT HIREDATE, TO_CHAR(hiredate, 'YYYY-MM-DD') FROM emp;
HIREDATE TO_CHAR(HI
------------------- ----------
17/12/1980 00:00:00 1980-12-17
20/02/1981 00:00:00 1981-02-20
22/02/1981 00:00:00 1981-02-22
02/04/1981 00:00:00 1981-04-02
28/09/1981 00:00:00 1981-09-28
01/05/1981 00:00:00 1981-05-01
09/06/1981 00:00:00 1981-06-09
09/12/1982 00:00:00 1982-12-09
17/11/1981 00:00:00 1981-11-17
08/09/1981 00:00:00 1981-09-08
12/01/1983 00:00:00 1983-01-12
03/12/1981 00:00:00 1981-12-03
03/12/1981 00:00:00 1981-12-03
23/01/1982 00:00:00 1982-01-23
14 rows selected.
会话级别:
SQL> alter session set nls_date_format='YYYY-MM-DD';
Session altered.
SQL> SELECT hiredate FROM emp;
HIREDATE
----------
1980-12-17
1981-02-20
1981-02-22
1981-04-02
1981-09-28
1981-05-01
1981-06-09
1982-12-09
1981-11-17
1981-09-08
1983-01-12
1981-12-03
1981-12-03
1982-01-23
14 rows selected.
SQL>
TO_DATE((select logical_date
这是错误的。
切勿在 DATE 列上应用 TO_DATE。它迫使 Oracle:
- 先转换成字符串
- 然后将其转换回日期
基于区域设置特定的 NLS 设置。您需要 TO_DATE 才能将文字转换为日期。对于 date-arithmetic,保留日期不变。
SELECT TO_CHAR((select logical_date -1 from logical_date
where logical_date_type='B'),'DD/MM/YYYY HH24:MI:SS') FROM DUAL;
这个查询returns23/04/2016 00:00:00
o/p of select logical_date -1 from logical_date where logical_date_type='B' :4/23/2016
SELECT TO_DATE((select logical_date -1 from logical_date
where logical_date_type='B'),'DD/MM/YYYY HH24:MI:SS') FROM DUAL;
这个查询 returns 4/23/0016
.
如何使用 TO_DATE 获得 TO_CHAR 给出的格式??
此问题与您在 oracle 客户端设置中配置的会话的默认日期格式有关 检查您的 Session
的 NLS_DATE_FORMAT 设置SELECT value
FROM nls_session_parameters
WHERE parameter = 'NLS_DATE_FORMAT'
您可以通过以下方式更改会话的此设置以获得所需的结果:
alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS';
日期没有任何固有格式。 Oracle 有一个内部表示,它看起来不像任何您认为是日期的东西。客户端或应用程序决定如何显示日期(例如使用 NLS_DATE_FORMAT),或者您可以使用 TO_CHAR
将日期转换为具有您指定格式的字符串,就像您在第一个例如。
在你的第二个例子中,你正在使用你的 NLS 设置将你的实际日期隐式转换为一个字符串 - 在此过程中失去了世纪,所以大概是 YY 而不是 YYYY - 然后你将它转换回来约会。当您交换月份和日期位置时,我很惊讶它没有出错。
不要那样做。转换为字符串并返回日期是没有意义的,即使您的设置不会在途中丢失信息。
如果您希望它作为客户端或其他进程使用的日期,只需执行以下操作:
select logical_date -1
from logical_date
where logical_date_type='B'
如果您想与另一个日期进行比较,则仍将其保留为日期:
select other_columns
from logical_date
where logical_date_type='B'
and logical_date -1 < sysdate
如果要指定格式 用于显示 然后使用:
select to_char(logical_date -1, 'DD/MM/YYYY')
from logical_date
where logical_date_type='B'
How do I get the format given by TO_CHAR using TO_DATE ?
首先,DATE没有任何格式。 Oracle 不会以您看到的格式存储日期。它在内部将其存储在 7 个字节 中,每个字节存储 datetime 值的不同组成部分。
Byte Description
---- -------------------------------------------------
1 Century value but before storing it add 100 to it
2 Year and 100 is added to it before storing
3 Month
4 Day of the month
5 Hours but add 1 before storing it
6 Minutes but add 1 before storing it
7 Seconds but add 1 before storing it
格式仅用于显示目的。 TO_DATE用于将文字转为日期,与格式化无关。要以您想要的格式显示日期,请使用 TO_CHAR 和适当的 FORMAT MODEL。
此外,请记住,格式具有 优先顺序:
让我们看看时间顺序,即从最高到最低:
在个人使用TO_CHAR或TO_DATE SQL声明
ALTER SESSION SET NLS_DATE_FORMAT=’whatever format model you want’;
在客户端机器
上将其设置为OS环境变量NLS_DATE_FORMAT
的设置在数据库初始化参数
例如,
个人SQL声明:
SQL> SELECT HIREDATE, TO_CHAR(hiredate, 'YYYY-MM-DD') FROM emp;
HIREDATE TO_CHAR(HI
------------------- ----------
17/12/1980 00:00:00 1980-12-17
20/02/1981 00:00:00 1981-02-20
22/02/1981 00:00:00 1981-02-22
02/04/1981 00:00:00 1981-04-02
28/09/1981 00:00:00 1981-09-28
01/05/1981 00:00:00 1981-05-01
09/06/1981 00:00:00 1981-06-09
09/12/1982 00:00:00 1982-12-09
17/11/1981 00:00:00 1981-11-17
08/09/1981 00:00:00 1981-09-08
12/01/1983 00:00:00 1983-01-12
03/12/1981 00:00:00 1981-12-03
03/12/1981 00:00:00 1981-12-03
23/01/1982 00:00:00 1982-01-23
14 rows selected.
会话级别:
SQL> alter session set nls_date_format='YYYY-MM-DD';
Session altered.
SQL> SELECT hiredate FROM emp;
HIREDATE
----------
1980-12-17
1981-02-20
1981-02-22
1981-04-02
1981-09-28
1981-05-01
1981-06-09
1982-12-09
1981-11-17
1981-09-08
1983-01-12
1981-12-03
1981-12-03
1982-01-23
14 rows selected.
SQL>
TO_DATE((select logical_date
这是错误的。
切勿在 DATE 列上应用 TO_DATE。它迫使 Oracle:
- 先转换成字符串
- 然后将其转换回日期
基于区域设置特定的 NLS 设置。您需要 TO_DATE 才能将文字转换为日期。对于 date-arithmetic,保留日期不变。