某种程度上select to_date('space','space') dt from dual;
返回一些日期2017-10-01
,
但to_date('','space')
或to_date('space','')
按预期返回null
。
其中"空间"是chr(32)
有什么想法吗?
由于
答案 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“无法确定哪种格式”,而是全部默认