我想用不同的随机月份和日期更新表中的所有生日。
以下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
有什么主意吗?
答案 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;