【问题标题】:SQL: minimal date when year is zeroSQL:年份为零的最小日期
【发布时间】:2020-09-29 13:29:52
【问题描述】:

我有一张类似这样的桌子

|----------|-----------|-----------|
|   year   |   month   |    day    |
|----------|-----------|-----------|
|0         |1          |1          |
|----------|-----------|-----------|
|2100      |5          |6          |
|----------|-----------|-----------|
|5         |7          |8          |
|----------|-----------|-----------|

我想选择最短日期。目前为止我用过

SELECT  min(TO_DATE(year ||'.'|| month||'.'|| day, 'YYYY.MM.DD'))
FROM    date_table;

应该返回

01.01.0000 00:00:00

问题在于TO_DATE 不接受等于零的年份。我该如何规避呢?

我正在使用 Oracle SQL。

【问题讨论】:

    标签: sql oracle min to-date


    【解决方案1】:

    您可以使用一些表达式和LPAD 函数来代替日期,如下所示:

    SELECT MIN(LPAD(YEAR,4,'0') || LPAD(MONTH,2,'0') || LPAD(DATE,2,'0')) FROM YOUR_TABLE;
    

    注意:Oracle 不支持将 0000 作为年份。它以 AD 和 BC 格式表示。所以 0001BC 被认为是 0001AD 之前的 1 年,即 0000。所以(0000 年 = 0001BC)

    【讨论】:

      【解决方案2】:

      您可以使用order by 并限制为一行:

      select t.*
      from t
      order by year, month, day
      fetch first 1 row only;
      

      这适用于 Oracle 12C+。在旧版本中:

      select t.*
      from (select t.*
            from t
            order by year, month, day
           ) t
      where rownum = 1;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-03
        • 2021-04-09
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        相关资源
        最近更新 更多