什么是Oracle的默认日期格式?

时间:2016-03-16 22:54:12

标签: sql oracle date-formatting

我有一个Oracle数据库,我无法控制日期格式。我想知道日期格式是什么,以确保搜索像

select * from search where search_date>='03/16/2016 00:00:00'

按预期工作。

3 个答案:

答案 0 :(得分:12)

不要这样做 - 你依赖隐式数据类型转换,这种转换在某些时候会失败。

您有两种选择:

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'),因为它们再次依赖于客户端语言。

更多详情可在手册中找到:
https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements003.htm#SQLRF51062

从不依赖隐式数据类型转换。

答案 1 :(得分:4)

您可以使用查询获取所有underscore会话参数:

_

或者,如果您拥有权限NLS,则可以使用以下命令:

SELECT * FROM NLS_SESSION_PARAMETERS;

如果您只想要日期格式,则可以执行以下任一操作:

GRANT SELECT ON V_$PARAMETER TO YOUR_USERNAME;

SHOW PARAMETER NLS;

但是,您也可以使用格式无关的ANSI日期(或时间戳)文字。 ANSI日期文字的格式为SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT'; ,时间戳文字的格式为SHOW PARAMETER NLS_DATE_FORMAT; 。所以你的查询将是:

DATE 'YYYY-MM-DD'

TIMESTAMP 'YYYY-MM-DD HH24:MI:SS.FF9'

答案 2 :(得分:0)

  

什么是Oracle的默认日期格式?

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 字符串文字进行比较。始终使用 TO_DATE 和正确的格式掩码将字符串显式转换为日期。

TO_DATE('03/16/2016', 'MM/DD/YYYY')

或者,如果您只处理日期部分而不关心时间部分,那么使用 ANSI日期文字,它使用固定格式DATE 'YYYY-MM-DD'

DATE '2016-03-16'

根据您的特定于语言环境的NLS设置,您可能会因为隐式数据类型转换而获得输出。永远不要依赖隐式数据类型转换,它可能对你有用,对于nls设置不同的其他人来说可能会失败。