Oracle 的默认日期格式是什么?
What is Oracle's Default Date Format?
我有一个 Oracle 数据库,但我无法控制日期格式。我想知道日期格式是什么,以确保搜索像
select * from search where search_date>='03/16/2016 00:00:00'
按预期工作。
不要那样做 - 您依赖于隐式数据类型转换,这在某些时候会失败。
您有两个选择:
1) 使用正确的 ANSI SQL 日期文字:
select *
from search
where search_date >= timestamp '2016-03-16 00:00:00';
2) 使用 to_date()
(或 to_timestamp()
)并使用自定义格式。
select *
from search
where search_date >= to_date('03/16/2016 00:00:00', 'mm/dd/yyyy hh24:mi:ss');
使用 to_date()
时,您应该避免任何依赖于语言的格式。使用数字表示月份,而不是缩写(例如 'Mar'
或 'Apr'
),因为它们再次依赖于 client 语言。
更多细节可以在手册中找到:
https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements003.htm#SQLRF51062
从不依赖隐式数据类型转换。
您可以通过查询获取所有 NLS
会话参数:
SELECT * FROM NLS_SESSION_PARAMETERS;
或者,如果您有权限GRANT SELECT ON V_$PARAMETER TO YOUR_USERNAME;
,您可以使用命令:
SHOW PARAMETER NLS;
如果您只想要日期格式,那么您可以执行以下任一操作:
SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT';
或
SHOW PARAMETER NLS_DATE_FORMAT;
但是,您也可以使用与格式无关的 ANSI 日期(或时间戳)文字。 ANSI 日期文字的格式为 DATE 'YYYY-MM-DD'
,时间戳文字的格式为 TIMESTAMP 'YYYY-MM-DD HH24:MI:SS.FF9'
。所以您的查询将是:
select * from search where search_date>= DATE '2016-03-16'
或
select * from search where search_date>= TIMESTAMP '2016-03-16 00:00:00'
What is Oracle's Default Date Format?
A 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_CHAR 和适当的 FORMAT MODEL.
为了比较,使用 TO_DATE 和适当的 FORMAT MODEL.
您在默认值 中看到的格式是您的特定于区域设置的 NLS 设置。
SQL> select parameter, value from v$nls_parameters where parameter='NLS_DATE_FORMAT';
PARAMETER VALUE
--------------- ----------------------------------------------------------------
NLS_DATE_FORMAT DD-MON-RR
SQL> select sysdate from dual;
SYSDATE
---------
17-MAR-16
SQL> select to_char(sysdate, 'mm/dd/yyyy hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'MM
-------------------
03/17/2016 12:48:41
SQL>
search_date>='03/16/2016 00:00:00'
您正在比较 DATE 与 string 文字。始终使用 TO_DATE 和正确的格式掩码将字符串显式转换为日期。
TO_DATE('03/16/2016', 'MM/DD/YYYY')
或者,如果您只处理日期部分而不关心时间部分,则使用 ANSI 日期文字,它使用固定格式 DATE 'YYYY-MM-DD'
DATE '2016-03-16'
由于隐式数据类型转换,您可能只是幸运地获得了输出,该转换基于您的区域设置特定的 NLS 设置。永远不要依赖隐式数据类型转换,它可能对你有用,可能对 nls 设置不同的其他人失败。
我有一个 Oracle 数据库,但我无法控制日期格式。我想知道日期格式是什么,以确保搜索像
select * from search where search_date>='03/16/2016 00:00:00'
按预期工作。
不要那样做 - 您依赖于隐式数据类型转换,这在某些时候会失败。
您有两个选择:
1) 使用正确的 ANSI SQL 日期文字:
select *
from search
where search_date >= timestamp '2016-03-16 00:00:00';
2) 使用 to_date()
(或 to_timestamp()
)并使用自定义格式。
select *
from search
where search_date >= to_date('03/16/2016 00:00:00', 'mm/dd/yyyy hh24:mi:ss');
使用 to_date()
时,您应该避免任何依赖于语言的格式。使用数字表示月份,而不是缩写(例如 'Mar'
或 'Apr'
),因为它们再次依赖于 client 语言。
更多细节可以在手册中找到:
https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements003.htm#SQLRF51062
从不依赖隐式数据类型转换。
您可以通过查询获取所有 NLS
会话参数:
SELECT * FROM NLS_SESSION_PARAMETERS;
或者,如果您有权限GRANT SELECT ON V_$PARAMETER TO YOUR_USERNAME;
,您可以使用命令:
SHOW PARAMETER NLS;
如果您只想要日期格式,那么您可以执行以下任一操作:
SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT';
或
SHOW PARAMETER NLS_DATE_FORMAT;
但是,您也可以使用与格式无关的 ANSI 日期(或时间戳)文字。 ANSI 日期文字的格式为 DATE 'YYYY-MM-DD'
,时间戳文字的格式为 TIMESTAMP 'YYYY-MM-DD HH24:MI:SS.FF9'
。所以您的查询将是:
select * from search where search_date>= DATE '2016-03-16'
或
select * from search where search_date>= TIMESTAMP '2016-03-16 00:00:00'
What is Oracle's Default Date Format?
A 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_CHAR 和适当的 FORMAT MODEL.
为了比较,使用 TO_DATE 和适当的 FORMAT MODEL.
您在默认值 中看到的格式是您的特定于区域设置的 NLS 设置。
SQL> select parameter, value from v$nls_parameters where parameter='NLS_DATE_FORMAT';
PARAMETER VALUE
--------------- ----------------------------------------------------------------
NLS_DATE_FORMAT DD-MON-RR
SQL> select sysdate from dual;
SYSDATE
---------
17-MAR-16
SQL> select to_char(sysdate, 'mm/dd/yyyy hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'MM
-------------------
03/17/2016 12:48:41
SQL>
search_date>='03/16/2016 00:00:00'
您正在比较 DATE 与 string 文字。始终使用 TO_DATE 和正确的格式掩码将字符串显式转换为日期。
TO_DATE('03/16/2016', 'MM/DD/YYYY')
或者,如果您只处理日期部分而不关心时间部分,则使用 ANSI 日期文字,它使用固定格式 DATE 'YYYY-MM-DD'
DATE '2016-03-16'
由于隐式数据类型转换,您可能只是幸运地获得了输出,该转换基于您的区域设置特定的 NLS 设置。永远不要依赖隐式数据类型转换,它可能对你有用,可能对 nls 设置不同的其他人失败。