PLSQL-在保留年份的同时使用随机的月份和日期进行更新

时间:2018-06-20 14:11:57

标签: sql date plsql

我想用不同的随机月份和日期更新表中的所有生日。

以下sql正常工作

update PERSON set bithday = TO_DATE(TRUNC(DBMS_RANDOM.VALUE(TO_CHAR(DATE '1940-01-01','J') ,TO_CHAR(DATE '1940-12-31','J'))),'J') ;

但这一年留在1940年。 为了保持最初的生日,我像这样修改了sql

update PERSON set bithday = TO_DATE(TRUNC(DBMS_RANDOM.VALUE(TO_CHAR(DATE ''||extract(year from bithday)||'-01-01','J') ,TO_CHAR(DATE ''||extract(year from bithday)||'-12-31','J'))),'J');

但这给我一个错误

01841. 00000 -  "(full) year must be between -4713 and +9999, and not be 0"
*Cause:    Illegal year entered

有什么主意吗?

2 个答案:

答案 0 :(得分:1)

问题出在您使用DATE的方式上;如果您需要从字符串中获取日期,则必须使用to_date,而不是DATE

例如,这可行

SQL> select date '2018-01-01' from dual;

DATE'2018
---------
01-JAN-18

但是

SQL> select date '2018-' || '01-01' from dual;
select date '2018-' || '01-01' from dual
            *
ERROR at line 1:
ORA-01843: not a valid month


SQL> select date extract(year from sysdate) || '-01-01' from dual;
select date extract(year from sysdate) || '-01-01' from dual
       *
ERROR at line 1:
ORA-00936: missing expression


SQL> select date '2018' || '-01-01' from dual;
select date '2018' || '-01-01' from dual
            *
ERROR at line 1:
ORA-01861: literal does not match format string


SQL> select date '''' || extract(year from sysdate) || '-01-01' from dual;
select date '''' || extract(year from sysdate) || '-01-01' from dual
            *
ERROR at line 1:
ORA-01841: (full) year must be between -4713 and +9999, and not be 0

关于您的需求,这可能是一个更简单的解决方案:

update person    
set birthday = trunc(birthday, 'YEAR') + mod(abs(dbms_random.random), 365)

答案 1 :(得分:0)

如果您可以与not年12月31日出生的人生活在一起,那么一个简单的方法是:

select trunc(bithday, 'YYYY') + trunc(dbms_random.value * 365) * interval '1' day

这很容易变成update

update PERSON
    set bithday = trunc(bithday, 'YYYY') + trunc(dbms_random.value * 365) * interval '1' day;