如何结合一列的日期和另一列的时间

Posted

技术标签:

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

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

    FROMDATE 包含没有时间的日期的列,例如08-01-2017 00:00:00 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 进行了很多尝试,但未能获得预期的结果。

【问题讨论】:

【参考方案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 没问题 ;)

以上是关于如何结合一列的日期和另一列的时间的主要内容,如果未能解决你的问题,请参考以下文章

根据另一列的日期戳条件打印行

根据另一列的值修改熊猫中的日期时间列

Oracle - 将日期从一列复制到另一列的更新语句

验证一列大于yii中另一列的日期

另一列的每个连续数据块的最小日期[重复]

SQL - 根据另一列中的日期过滤一列的结果