【问题标题】:How to combine date from one column and time from another如何结合一列的日期和另一列的时间
【发布时间】:2016-12-29 10:41:17
【问题描述】:

目前我正在尝试从两个日期列中选择一个日期时间列。我有以下情况:

  1. FROMDATE 包含没有时间的日期的列,例如08-01-2017 00:00:00
  2. FROMTIME 包含没有日期的时间的列,例如01-01-1899 13:50:00

现在我想在一列中同时选择两者,例如SELECT (<what ever>) as FROMDATETIME ...

预期结果:08-01-2017 13:50:00

但我无法提取日期和时间部分并将它们作为datetime 添加在一起。

以一种 meta sql:select (date(FROMDATE) + time(FROMTIME)) as FROMDATETIME.

我对@9​​87654328@ 和TO_DATE 进行了很多尝试,但未能获得预期的结果。

【问题讨论】:

    标签: sql oracle date


    【解决方案1】:

    给你:

    SELECT TO_DATE(TO_CHAR(t.fromdate,'dd-mm-yyyy') ||
                   ' ' ||
                   TO_CHAR(t.fromtime,'hh24:mi:ss'),'dd-mm-yyyy hh24:mi:ss') as full_date_col 
    FROM YourTable t
    

    【讨论】:

      【解决方案2】:

      一种方法可以将所有内容转换为 char,然后使用值的连接:

      select to_date(to_char(FROMDATE, 'dd-mm-yyyy') || to_char(FROMTIME, 'hh24:mi:ss'), 'dd-mm-yyyyhh24:mi:ss')
      from test
      

      ...但我想做(但我不能)在 Alex Poole 的回答中

      【讨论】:

        【解决方案3】:

        你也可以使用日期算术:

        fromtime + (fromdate - trunc(fromtime))
        

        fromdate - trunc(fromtime) 部分获取“时间”列中的名义日期(其中trunc 将时间归零)与“日期”列中的实际日期之间的整数天数。在您的示例中,即 2017-01-08 和 1899-01-01 之间的 43106 天。然后可以将该天数添加到 fromtime,这会将 1899 年的日期增加 43106 天,以匹配 2017 年的日期。

        快速演示,使用 CTE 生成两个示例值,并显示日期之间的天数以及您想要的结果:

        with t (fromdate, fromtime) as (
          select date '2017-01-08', cast (timestamp '1899-01-01 13:50:00' as date)
          from dual
        )
        select fromdate - trunc(fromtime) as days,
          fromtime + (fromdate - trunc(fromtime)) as fromdatetime,
          to_char(fromtime + (fromdate - trunc(fromtime)), 'DD-MM-YYYY HH24:MI:SS') as formatted
        from t;
        
              DAYS FROMDATETIME        FORMATTED          
        ---------- ------------------- -------------------
             43106 2017-01-08 13:50:00 08-01-2017 13:50:00
        

        【讨论】:

        • 请帮我理解;是括号中的“秘密”,然后在他找到括号时进行的隐式转换,对吗?
        • @Aleksej - 我已经更新了更多解释。括号中的位只是获得整数天数 - 不是真正的隐式转换,这就是日期算术返回的内容?添加到原始时间的那个数字也只是普通的日期算术。 (括号是为了让减法首先发生 - 否则你会得到数据+日期,这会得到 ORA-00975。)
        • 当您理解优雅的解决方案时,它们看起来总是那么明显……我可以投赞成票吗? :)
        【解决方案4】:

        如果您的 fromdatefromtime 列是 DATE 类型,您可以执行以下操作:

        SELECT
            TO_DATE(
              TO_CHAR(fromdate, 'DD-MM-YYYY') || ' ' || TO_CHAR(fromtime, 'HH24:MI:SS'),
              'DD-MM-YYYY HH24:MI:SS'
            ) AS fromdatetime
        FROM my_table;
        

        如果您的列是 VARCHAR,则必须执行以下操作

        SELECT
            TO_DATE(
              TO_CHAR(TO_DATE(fromdate, 'DD-MM-YYYY HH24:MI:SS'), 'DD-MM-YYYY') || ' ' || TO_CHAR(TO_DATE(fromtime, 'DD-MM-YYYY HH24:MI:SS'), 'HH24:MI:SS'),
              'DD-MM-YYYY HH24:MI:SS'
            ) AS fromdatetime
        FROM my_table;
        

        【讨论】:

        • 感谢您的解释!
        • @BendEg 没问题 ;)
        猜你喜欢
        • 2015-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 2023-02-07
        • 1970-01-01
        • 2013-07-29
        相关资源
        最近更新 更多