Sql 什么是甲骨文';默认的日期格式是什么?

Sql 什么是甲骨文';默认的日期格式是什么?,sql,oracle,date-formatting,Sql,Oracle,Date Formatting,我有一个Oracle数据库,我不控制日期格式。我想知道什么是日期格式,以确保搜索像 按预期工作。不要这样做-您依赖的是隐式数据类型转换,这种转换在某个时候会失败 您有两个选择: 1) 使用正确的ANSI SQL日期文字: select * from search where search_date >= timestamp '2016-03-16 00:00:00'; 2) 使用到日期()(或到时间戳())并使用自定义格式 select * from search where

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


按预期工作。

不要这样做-您依赖的是隐式数据类型转换,这种转换在某个时候会失败

您有两个选择:

1) 使用正确的ANSI SQL日期文字:

select * 
from search 
where search_date >= timestamp '2016-03-16 00:00:00';
2) 使用
到日期()
(或
到时间戳()
)并使用自定义格式

select * 
from search 
where search_date >= to_date('03/16/2016 00:00:00', 'mm/dd/yyyy hh24:mi:ss');
使用
to_date()
时,应避免使用任何依赖于语言的格式。使用月份的数字,而不是缩写(例如
'Mar'
'Apr'
),因为它们同样依赖于客户端语言

更多详细信息可在手册中找到:



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

您可以通过查询获得所有
NLS
会话参数:

SELECT * FROM NLS_SESSION_PARAMETERS;
或者,如果您有权限
将SELECT ON V_u$参数授予您的_用户名,您可以使用以下命令:

SHOW PARAMETER NLS;
如果您只需要日期格式,则可以执行以下任一操作:

SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT';

但是,您也可以使用ANSI日期(或时间戳)文本,这些文本与格式无关。ANSI日期文字的格式为
date'yyyyy-MM-DD'
,时间戳文字的格式为
timestamp'yyy-MM-DD HH24:MI:SS.FF9'
。所以你的问题是:

select * from search where search_date>= DATE '2016-03-16'

Oracle的默认日期格式是什么

日期没有任何格式。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
要显示,请使用适当的格式模型来显示字符

要进行比较,请使用适当的格式模型来确定日期

默认情况下,您所看到的格式是特定于语言环境的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>
搜索日期>='03/16/2016 00:00:00'

您正在将日期字符串文本进行比较。始终使用TO_date和适当的格式掩码将字符串显式转换为日期

TO_DATE('03/16/2016', 'MM/DD/YYYY')
或者,如果您只处理日期部分而不关心时间部分,则使用ANSI日期文字,它使用固定格式
日期'YYYY-MM-DD'

DATE '2016-03-16'

由于基于特定于语言环境的NLS设置的隐式数据类型转换,您可能很幸运地获得了一个输出。永远不要依赖隐式数据类型转换,它可能对您有效,也可能对nls设置不同的其他人无效。

回答不错,但有个问题。对于像单片数据仓库这样的数据格式不会改变的东西,你真的认为有那么糟糕吗?出于我的目的,我只是进行一次性查询,但在查询数据时通常会忘记格式。当然,对于我所说的,一个完全有效的反驳是,使用
to_date
函数与先查询
NLS_date_FORMAT
,然后运行惰性查询一样简单。@entpnerd日期格式可以更改,即使在“单片数据仓库”中也是如此,因为它是由客户端定义的,不是服务器(使用英语操作系统的客户端的日期格式与使用德语操作系统的客户端的日期格式不同)。如果您通常忘记了日期格式,那么请坚持使用ANSI格式-这是最短的格式,无论NLS设置如何(显式或隐式),它都将始终有效。您需要了解,日期或时间戳列是以内部二进制格式存储的。您看到的是显示的字符表示。这是由NLS_DATE_FORMAT的设置控制的,可以在不同的级别上进行设置,大多数级别您都无法控制。我有一篇文章对此进行了详细说明,当
SEARCH\u DATE
的数据类型为
DATE
时,如果您与
TIMESTAMP
值进行比较,则会执行隐式数据转换,这应该用您自己的话来避免。有:类型12有7个字节(
从表名中选择转储(日期列)
)类型13有8个字节(
选择DUMP(SYSDATE)FROM DUAL
)。这两种类型不是格式。格式并不意味着内部字节表示。特别是对于假定显示为日期格式的OP。好的,在我之前的评论中将“格式”替换为“数据结构”。然而,重点仍然是,关于日期字节结构的第一部分仅仅是故事的一半,因为有一个8字节的结构也用于日期。@MT0为了在表中存储日期,7个字节就足够了。第8个字节用于内部日期函数,如SYSDATE或需要使用to_DATE进行转换的外部日期函数。本主题是关于存储日期的,因此,当您在表中存储日期时,即使在插入时使用SYSDATE或TO_date,转储文件的长度也将为Len=7。@DS。不要依赖于默认日期格式的一致性,因为它是由用户的客户端(而不是服务器)设置的会话参数-这意味着每个用户可以在自己的会话中设置值,以便两个用户可以具有不同的值,甚至,一个用户在不同的会话中可以有不同的值-这在国际组织中尤其如此,在这些组织中,客户端默认值将取决于客户端的地域/语言默认值。可以使用日期/时间戳文字,也可以使用显式格式模型的
TO_date
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>
TO_DATE('03/16/2016', 'MM/DD/YYYY')
DATE '2016-03-16'