oracle-sqldeveloper - 如何在 Oracle SQL 中组合整数列以形成日期
问题描述
我有一个表,其中列 salDay、SalYear 和 Salmonth.saLday 存储整数介于 1 和 31 之间,salYear 存储整数年份,例如 2013、2015 ......并且 salMonth 存储整数月份介于 1 和 12 之间。我想填充另一个名为 received_date 的列结合 salday、salmonth 和 salyear 以获取 DD/MM/YYYY 形式的日期。
请问有什么想法吗?
解决方案
您可以将列(显式或隐式转换为字符串)连接在一起并用于to_date()
将结果转换为实际日期:
create table your_table (salDay number, salMonth number, salYear number);
insert into your_table (salDay, salMonth, salYear) values (27, 3, 2019);
select to_date(salYear ||'-'|| salMonth ||'-'|| salDay, 'YYYY-MM-DD') as salDate
from your_table;
SALDATE
-------------------
2019-03-27 00:00:00
如果您希望将其作为表中的另一列,则可以使用具有相同转换的虚拟列:
alter table your_table
add salDate date generated always as (to_date(salYear ||'-'|| salMonth ||'-'|| salDay, 'YYYY-MM-DD'));
Table YOUR_TABLE altered.
select * from your_table;
SALDAY SALMONTH SALYEAR SALDATE
---------- ---------- ---------- -------------------
27 3 2019 2019-03-27 00:00:00
当然,如果您的日期无效,这两个都会有问题。在第一种情况下,当您使用该查询时会出错;第二,当您查询新列时会出错。但这不会阻止您仍然将不良数据放入其中。
insert into your_table (salDay, salMonth, salYear) values (29, 2, 2019);
1 row inserted.
select * from your_table;
ORA-01839: date not valid for month specified
您可以在该虚拟列上使用索引或约束来防止这种情况 - 任何会导致转换尝试作为插入的一部分的任何事情,这反过来又会导致插入失败:
create index your_index on your_table (salDate);
Index YOUR_INDEX created.
insert into your_table (salDay, salMonth, salYear) values (29, 2, 2019);
ORA-01839: date not valid for month specified
推荐阅读
- r - 使用 geom_sf 将纬度/经度点转换为地图
- javascript - 如何使用 webpack、内容安全策略和 fetch/ajax 调用来拥有自己的服务器和外部站点?
- javascript - 如何创建一个接受空字符串/空值的正则表达式?
- c# - 如果字符串是 C# 中的引用类型,为什么传递字符串参数表现为值类型?
- javascript - 如何正确打包使用电子功能的电子/反应应用程序?
- javascript - 我想将对象的平面数组存储为嵌套对象形式(如树格式)
- java - MongoDB Java驱动程序将嵌套对象的id字段转换为_id
- python - Tkinter 主题和背景
- mysql - mysqli_real_connect(): (HY000/1045): Access denied for user 'phpmyadmin'@'localhost' (使用密码: YES)
- javascript - 在删除 baseHref Angular 后状态导航不起作用