在 Oracle SQL 中组合不同的日期和时间列以创建一个具有日期/时间格式的列

Posted

技术标签:

【中文标题】在 Oracle SQL 中组合不同的日期和时间列以创建一个具有日期/时间格式的列【英文标题】:Combine Different Date and Time Column to make one Column with Date/Time format in Oracle SQL 【发布时间】:2022-01-13 13:15:50 【问题描述】:

我正在使用有约会表的数据库。有两列

ApptDate ApptTime
9/26/21  9:00 AM
9/25/20  1:00 PM

我想在将 ApptDate 列设置为 ApptDateTime 列之后删除 ApptTime 列。 我尝试过 concatnate 但我不知道如何将 AppDate 列的数据类型更改为 DATETIME 数据类型并同时更新所有值。 我尝试了以下操作:

ALTER SESSION SET nls_date_format = 'DD-MON-YYYY hh24:mi'

UPDATE Appointment
SET ApptDate = ApptDate ||' ' ||ApptTime;

ALTER TABLE Appointment
MODIFY(
ApptDate DATE
);

但我得到的错误是只能更改空表的数据类型。 请建议。

【问题讨论】:

是的,您不能将 VARCHAR2 更改为 DATE。您需要创建一个临时的第三列作为 DATE 并分配转换后的字符串值,然后删除 ApptDate,并将新列重命名为 AddDate 【参考方案1】: 案例 1:如果 ApptDate 列是字符串类型,则重新创建表并将其填充为
/*CREATE TABLE Appointment( ApptDate VARCHAR2(15), ApptTime VARCHAR2(15) );

INSERT INTO Appointment
SELECT '9/26/21','9:00 AM' FROM dual UNION ALL
SELECT '9/25/20','1:00 PM' FROM dual; -- already existing state */

CREATE TABLE Appointment2 AS
SELECT TO_DATE(ApptDate||' '||ApptTime,'MM/DD/RR HH:MI PM') AS ApptDate      
  FROM Appointment;
  
DROP TABLE Appointment;

RENAME Appointment2 TO Appointment
案例 2:如果 ApptDate 列的数据类型是 date,则使用以下代码块
/*CREATE TABLE Appointment( ApptDate DATE, ApptTime VARCHAR2(15) );

INSERT INTO Appointment
SELECT date'2021-09-26','9:00 AM' FROM dual UNION ALL
SELECT date'2020-09-25','1:00 PM' FROM dual; -- already existing state */

CREATE TABLE Appointment2 AS
SELECT TO_DATE(ApptDate||' '||ApptTime,'RRRR-MM-DD HH:MI PM') AS ApptDate      
  FROM Appointment;
  
DROP TABLE Appointment;

RENAME Appointment2 TO Appointment

Demo

【讨论】:

以上是关于在 Oracle SQL 中组合不同的日期和时间列以创建一个具有日期/时间格式的列的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法来编写这个处理比较两个不同列中的日期的 Oracle SQL?

如果列的值在 Oracle sql 中的格式不同,则使用特定格式更新日期

(Oracle) SQL 中的正则表达式将日期/时间拆分为单独的日期和时间列

如何在 Oracle SQL 中使用月份作为日期列

日期格式的 Oracle SQL 查询

从 oracle-sql 中的时间戳日期列中提取日期