Max*_*min 2 oracle-11g-r2 date-format update
当我检查我的一个客户的数据库时,我发现了一些会产生问题的错误。问题是日期显示为01-01-01
当我尝试以dd-MM-yyyy
结果格式显示它时01-01-0001
。我怎样才能摆脱这个问题。是否可以在这些日期中单独更新年份。
我可以使用此查询找到有此问题的日期
select from_date from date_table where length(extract(year from from_date))='2';
我可以使用以下逻辑更新它吗
使用上述查询查找日期
通过检查条件更新年份 if year is between '00' and '13' prefix '20' with the year else prefix '19'
我怎样才能做到这一点?我可以使用 Oracle 查询来完成,还是应该为此编写代码?
数据库是在 RHEL5 中运行的 Oracle 11g R2。
我建议始终使用适当的数据类型、运算符和函数以及显式转换,而不是使用字符串文字和字符串处理以及隐式转换。
看你的说法
select from_date
from date_table
where length(extract(year from from_date))='2'
/
Run Code Online (Sandbox Code Playgroud)
length 语句的返回类型显然是一个数字。那么为什么要将它与字符串文字进行比较呢?有些东西必须隐式转换。长度函数的数字结果为字符串或字符串文字'2'
为数字。你知道转换的是哪一个吗?您知道这种转换是否会出现任何问题吗?使用字符串常量而不是数字常量是否有特殊原因?
据我所知,字符串常量将被转换为数字,我看不出这种转换有任何问题。我也认为您采用字符串常量而不是数字常量没有特殊原因。但是为什么要纠结这些问题呢?
使用数字文字并写入
select from_date
from date_table
where length(extract(year from from_date))=2
/
Run Code Online (Sandbox Code Playgroud)
我想你想通过隐式转换到一个很早的日期来找到 from_date 的所有行,因此是在 100 年 1 月 1 日之前。那么为什么要进行字符串处理呢?使用日期处理和写入
select from_date
from date_table
where from_date<to_date('0100-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
/
Run Code Online (Sandbox Code Playgroud)
如果 from_date 列上有索引,则此查询可能能够使用该索引。
此查询还将查找具有 from_date before'0010-01-01 00:00:00'
甚至 date before 的行'0000-00-00 00:00:00'
。它也可以很容易地调整到其他时间戳。但是,如果您想明确使用年份(并且您确定在 0 BC 之前没有日期),您可以
select from_date
from date_table
where extract(year from from_date) between 0 and 99
/
Run Code Online (Sandbox Code Playgroud)
如果 from_date 列上有索引,则此查询可能无法使用该索引。
将 2000 年添加到日期可以通过添加来完成 INTERVAL '2000' YEAR(4)
UPDATE table_date
SET from_date = from_date+INTERVAL '2000' YEAR(4)
WHERE to_date <to_date('0014-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
/
UPDATE table_date
SET from_date = from_date+INTERVAL '1900' YEAR(4)
WHERE to_date >=to_date('0014-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
/
Run Code Online (Sandbox Code Playgroud)
因为您是通过插入日期表示为字符串的行开始进行字符串处理的,所以您还可以使用字符串处理进行更正。如果您在插入行时没有使用时间部分,您可以/应该HH24:MI:SS
在以下语句中省略格式部分
UPDATE table_date
SET from_date = to_date('20'||substring(to_char(from_date,'YYYY-MM-DD HH24:MI:SS'),2),'YYYY-MM-DD HH24:MI:SS')
WHERE to_date <to_date('0014-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
/
UPDATE table_date
SET from_date = to_date('19'||substring(to_char(from_date,'YYYY-MM-DD HH24:MI:SS'),2),'YYYY-MM-DD HH24:MI:SS')
WHERE to_date >=to_date('0014-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
/
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17432 次 |
最近记录: |