【问题标题】:oracle 12c select to_date(' ',' ') dt from dual; returns 2017-10-01oracle 12c select to_date(' ',' ') dt from dual;返回 2017-10-01
【发布时间】:2017-10-11 01:04:13
【问题描述】:

不知何故select to_date('space','space') dt from dual; 返回某个日期2017-10-01,

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

“空格”是chr(32)

有什么想法吗?

谢谢

【问题讨论】:

  • “预期为空”。我希望它会返回一个错误,就像它在 Oracle 11 中一样。
  • >select to_date(chr(32),chr(32)) dt from dual; DT --------- 01-OCT-17
  • 可以在 11g 中重现也可以看到 rextester.com/RTZJTK74192 虽然不知道为什么有人会在空间格式的空间上使用 to_date...

标签: sql oracle to-date


【解决方案1】:

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

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

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

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

在您的代码中,您指定一个不带时间组件的日期和不带日期组件。从上面应用两个默认值,您将得到答案。

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

【讨论】:

    【解决方案2】:

    根据 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 无法计算出正在使用的格式或输入日期,因此它使用当前月份和年份的第一天,即 2017-10- 01(yyyy-mm-dd 格式)。

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

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

    更新:正如下面提到的 mathguy: 如果要转换的字符串和格式模型都缺少日期,则默认情况下假定为 1。等等。`to_date('15', 'dd') 将在当前日期的 15 日午夜返回月和年。在极端情况下,OP 省略了 BOTH 参数中的所有元素,因此所有元素都被分配了默认值。不是Oracle“搞不定什么格式”,而是都是默认的

    【讨论】:

    • 非常接近!默认值确实是这些,我之前在文档中看到过它们 - 如果我能找到链接,我会在此处添加它。 “默认值”的解释并不完全正确。相反,如果要转换的字符串和格式模型都缺少日期,则默认情况下假定为 1。等等。`to_date('15', 'dd') 将在 15 日午夜返回当前月份和年份。在极端情况下,OP 省略了 BOTH 参数中的所有元素,因此所有元素都被分配了默认值。不是Oracle“搞不定什么格式”,而是全是默认。
    • 谢谢!我已经用这些信息更新了我的答案。很高兴知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2015-04-11
    • 2017-10-22
    • 2011-12-06
    • 2015-08-01
    相关资源
    最近更新 更多