莫名其妙select to_date('space','space') dt from dual;
返回一些日期2017-10-01
,oracle 12c从dual中选择to_date('','')dt;回到2017年10月1日
但to_date('','space')
或to_date('space','')
返回null
预期。
其中 “空间” 是chr(32)
任何想法?
感谢
莫名其妙select to_date('space','space') dt from dual;
返回一些日期2017-10-01
,oracle 12c从dual中选择to_date('','')dt;回到2017年10月1日
但to_date('','space')
或to_date('space','')
返回null
预期。
其中 “空间” 是chr(32)
任何想法?
感谢
据有关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参数中的所有元素,因此所有元素都被分配了默认值。这并不是说甲骨文“不能制定出什么样的格式”,而是它的所有默认
我无法找到文档中的所有默认设置,而这应该足够了:
如果您指定一个没有时间分量的日期值,那么默认 时间是午夜。如果您指定的日期值没有日期,则默认日期是当月的第一天。
https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions191.htm#SQLRF06132
(这是Oracle 11.1,但你会觉得其他版本相同)。
在您的代码中,您可以指定日期,但不包含日期组件的时间组件和。从上面应用这两个默认值,你会得到你的答案。
这个难题的另一小部分是对空间的处理。您可以采取任何有效的TO_DATE()
并在两个参数中的任意日期和时间元素周围添加大量空格,并且您会看到它们被忽略。在你的情况下,单个空间被忽略(但不是“折叠” - 你的输入不会被转换为空字符串,这意味着Oracle中的null
)。
“按预期空值”。我期待它会返回一个错误,就像它在Oracle 11中一样。 –
> select from_date(chr(32),chr(32))dt; DT --------- 01-OCT-17 –
可以在11g中重现也可以查看http://rextester.com/RTZJTK74192虽然不确定为什么有人会在格式空间上使用to_date的空间... –