oracle 12c选择to_date('','')dt from dual;返回2017-10-01

时间:2017-10-11 01:04:14

标签: sql oracle to-date

某种程度上select to_date('space','space') dt from dual; 返回一些日期2017-10-01

to_date('','space')to_date('space','')按预期返回null

其中"空间"是chr(32)

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:3)

我无法在文档中找到所有默认值,但这应该足够了:

  

如果指定没有时间组件的日期值,则为默认值   时间是午夜。如果您指定的日期值没有日期,那么   默认日期是当月的第一天。

https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions191.htm#SQLRF06132

(这适用于Oracle 11.1,但您会发现其他版本相同)。

在您的代码中,您指定的日期没有包含日期​​组件的时间组件。从上面应用两个默认值,您将得到答案。

另一小部分难题是空间的处理。您可以使用任何有效的TO_DATE()并在两个参数中的任何日期和时间元素周围添加大量空格,您将看到它们被忽略。在您的情况下,忽略单个空格(但不会“折叠” - 您的输入不会转换为空字符串,这意味着Oracle中的null。)

答案 1 :(得分:1)

根据AskTom论坛上的Tom Kyte的说法,当无法确定格式和输入日期时,有一些默认值与TO_DATE一起使用。

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:4843459400346642911

default year   = current year 
default month  = current month 
default day    = 1
default hour   = 0
default minute = 0
default second = 0

这意味着使用TO_DATE('','')表示Oracle无法确定使用的格式或输入日期,因此它使用当前月份和年份的第1天,即2017-10- 01(yyyy-mm-dd格式)。

这也意味着您对TO_DATE('','')的第二个查询返回NULL,因为您作为日期提供的值为空。这与空间不同 - 我认为Oracle看到了空间,并认为“哦,我不知道这是什么,我会显示默认值。”

在Oracle格式模型documentation page here上有一个简短的提及,但我找不到默认值是什么。

更新:正如下面提到的mathguy: 如果从转换的字符串和格式模型中缺少一天,那么默认情况下它被假定为1.等等.`to_date('15','dd')将在当前的15日午夜返回一个月和一年。在极端情况下,OP省略了BOTH参数中的所有元素,因此为所有元素分配了默认值。这不是Oracle“无法确定哪种格式”,而是全部默认