【问题标题】:PLSQL - update with random month and day while keeping yearPLSQL - 在保持年份的同时随机更新月份和日期
【发布时间】:2018-11-29 17:02:18
【问题描述】:

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

下面的 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

有什么想法吗?

【问题讨论】:

  • 为什么需要一个存储过程来进行如此简单的更新?

标签: sql date plsql


【解决方案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)

【讨论】:

  • 谢谢,但仍然无法更新 PERSON set bithday = TO_DATE(TRUNC(DBMS_RANDOM.VALUE(TO_CHAR(TO_DATE(extract(year from bithday)||'-01-01','J')) ,TO_CHAR(DATE ''||提取(从生日算起的年份)||'-12-31','J'))),'J');
【解决方案2】:

如果你可以和不是闰年 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-18
    • 2013-09-23
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多