2017-10-11 55 views
2

莫名其妙select to_date('space','space') dt from dual; 返回一些日期2017-10-01oracle 12c从dual中选择to_date('','')dt;回到2017年10月1日

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

其中 “空间” 是chr(32)

任何想法?

感谢

+1

“按预期空值”。我期待它会返回一个错误,就像它在Oracle 11中一样。 –

+0

> select from_date(chr(32),chr(32))dt; DT --------- 01-OCT-17 –

+0

可以在11g中重现也可以查看http://rextester.com/RTZJTK74192虽然不确定为什么有人会在格式空间上使用to_date的空间... –

回答

1

据有关AskTom论坛汤姆凯特,但是也有一些与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不能工作了正在使用的格式或输入日期,所以它采用了当月的第一天和年,这是2017-10-01(yyyy-mm-dd格式)。

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

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

更新:如下所述的数学运算: 如果从转换的字符串AND格式模型中缺少一天,那么默认情况下它假定为1.等等to_date('15',' dd')将在当前月份和年份的第15天午夜返回。极端情况下,OP省略了BOTH参数中的所有元素,因此所有元素都被分配了默认值。这并不是说甲骨文“不能制定出什么样的格式”,而是它的所有默认

+1

这非常接近!默认值的确是那些,我之前在文档中看到过它们 - 如果我能找到链接,我会在这里添加它。 “违约”的解释并不完全正确。相反,如果缺少来自格式模型的要转换的字符串AND,那么默认情况下它假定为1.等等'to_date('15','dd')将在15日的15日返回午夜。当前的月份和年份。极端情况下,OP省略了BOTH参数中的所有元素,因此所有元素都被分配了默认值。并不是说Oracle不能“计算出什么格式”,而是所有的默认值。 – mathguy

+0

谢谢!我用这些信息更新了我的答案。很高兴知道。 – bbrumm

3

我无法找到文档中的所有默认设置,而这应该足够了:

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

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

(这是Oracle 11.1,但你会觉得其他版本相同)。

在您的代码中,您可以指定日期,但不包含日期组件的时间组件。从上面应用这两个默认值,你会得到你的答案。

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

相关问题