带有输入参数的 Oracle 日期格式 - PL SQL
Oracle Date Format with input Parametres - PLSQL
我收到如下错误:
ORA-01858 - 在需要数字字符的地方发现了非数字字符。
虽然它不是很准确,但我相信它与以下几行中的日期格式有关。
ELSIF par_report_eff_date_start IS NOT NULL AND par_report_eff_date_start = to_date(par_report_eff_date_start, 'fxdd-mm-yyyy')
和
ELSIF par_report_eff_date_end IS NOT NULL AND par_report_eff_date_end = to_date( par_report_eff_date_end ,'fxDD-MM-YYYY')
我正在尝试获取参数以在传入时以 'dd/mm/yyyy' 的格式呈现日期,但我不确定如何解决这个问题。
我看过了,但工作时网络访问受限,所以我无法使用常规网站。
procedure collect_mon_comm_bal_data_part (
par_report_eff_date_start DATE DEFAULT NULL, --dd/mm/yyyy;
par_report_eff_date_end DATE DEFAULT NULL) --dd/mm/yyyy;
is
v_report_eff_date_start DATE;
v_report_eff_date_end DATE;
BEGIN
IF par_report_eff_date_start IS NULL
THEN
-- Oracle job runs at the beginning of each month
select trunc(trunc(sysdate,'Mon')-1,'Mon')
into v_report_eff_date_start
from dual; -- Start of month Var
ELSIF par_report_eff_date_start IS NOT NULL AND par_report_eff_date_start = to_char(par_report_eff_date_start, 'fxdd/mm/yyyy')
THEN
v_report_eff_date_start := par_report_eff_date_start;
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_start || 'Is The Start Date');
ELSE
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_start || 'Is is the wrong format, needs tp be in dd/mm/yyyy');
GOTO the_end;
END IF;
IF par_report_eff_date_end IS NULL
THEN
-- Oracle job runs at the beginning of each month
select trunc(sysdate,'MM')-1
into v_report_eff_date_end
from dual; -- Start of month Var
ELSIF par_report_eff_date_end IS NOT NULL AND par_report_eff_date_end = to_char(par_report_eff_date_end, 'fxdd/mm/yyyy')
THEN
v_report_eff_date_end := par_report_eff_date_end;
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_end || 'Is The Start Date');
ELSE
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_end || 'Is is the wrong format, needs tp be in dd/mm/yyyy');
GOTO the_end;
END IF;
END;
您不想将 date
转换为 date
。你想把它转换成一个字符串。所以尝试:
to_char(par_report_eff_date_start, 'fxdd-mm-yyyy')
我不确定其余的逻辑应该做什么。但是,您使用 to_date()
将值 转换为 日期,并使用 to_char()
将值转换为字符串。
我注意到您有参数 par_report_eff_date_start 和一个变量 v_report_eff_date_start。您可能想要比较以下行中的那些:
ELSIF par_report_eff_date_start 不为空且 par_report_eff_date_start = to_char(par_report_eff_date_start, 'fxdd/mm/yyyy')
但现在您要将日期 参数 与从参数值派生的文本值进行比较。我不认为那是你想要的。
日期只是一个日期,在将其转换为另一种数据类型(如 VARCHAR2)时,您只需考虑格式掩码。
那么为什么不使用:
ELSIF par_report_eff_date_start 不是 NULL AND trunc(par_report_eff_date_start) = trunc(sysdate, 'Mon')
我已经将 trunc() 添加到参数值中,并且因为您想要每月的第一天(我猜!!),trunc(sysdate, 'Mon') 就可以了。
谢谢你 Gordon,我想我已经找到解决方法了。
procedure collect_mon_comm_bal_data_part (
par_report_eff_date_start VARCHAR2 DEFAULT NULL, --dd/mm/yyyy;
par_report_eff_date_end VARCHAR2 DEFAULT NULL) --dd/mm/yyyy; is
v_report_eff_date_start DATE; v_report_eff_date_end DATE;
BEGIN
IF par_report_eff_date_start IS NULL
THEN
-- Oracle job runs at the beginning of each month
select trunc(trunc(sysdate,'Mon')-1,'Mon')
into v_report_eff_date_start
from dual; -- Start of month Var
ELSIF par_report_eff_date_start IS NOT NULL AND to_date(par_report_eff_date_start, 'dd/mm/yyyy') = to_date(par_report_eff_date_start,'fxdd/mm/yyyy')
THEN
v_report_eff_date_start := to_date(par_report_eff_date_start, 'dd/mm/yyyy');
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_start || 'Is The Start Date');
ELSE
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_start || 'Is is the wrong format, needs tp be in dd/mm/yyyy');
GOTO the_end; END IF;
IF par_report_eff_date_end IS NULL
THEN
-- Oracle job runs at the beginning of each month
select trunc(sysdate,'MM')-1
into v_report_eff_date_end
from dual; -- Start of month Var
ELSIF par_report_eff_date_end IS NOT NULL AND to_date(par_report_eff_date_end, 'dd/mm/yyyy') = to_date(par_report_eff_date_end,'fxdd/mm/yyyy')
THEN
v_report_eff_date_end := to_date(par_report_eff_date_end, 'dd/mm/yyyy');
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_end || 'Is The Start Date');
ELSE
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_end || 'Is is the wrong format, needs tp be in dd/mm/yyyy');
GOTO the_end; END IF;
因此,如果参数为空,我希望它默认为上个月的每月 运行。我希望它 运行 对于选定的日期,如果它们在执行时手动输入,这样我可以 运行 它一年的时间来建立适当的数据样本,该样本将被更新随着它的变化向前发展。
我曾尝试传递虚假日期和空日期,但它们按预期命中了一个月数据的异常或 运行,所以这对我有用。
再次感谢大家,我真的帮了大忙!
我收到如下错误: ORA-01858 - 在需要数字字符的地方发现了非数字字符。 虽然它不是很准确,但我相信它与以下几行中的日期格式有关。
ELSIF par_report_eff_date_start IS NOT NULL AND par_report_eff_date_start = to_date(par_report_eff_date_start, 'fxdd-mm-yyyy')
和
ELSIF par_report_eff_date_end IS NOT NULL AND par_report_eff_date_end = to_date( par_report_eff_date_end ,'fxDD-MM-YYYY')
我正在尝试获取参数以在传入时以 'dd/mm/yyyy' 的格式呈现日期,但我不确定如何解决这个问题。
我看过了,但工作时网络访问受限,所以我无法使用常规网站。
procedure collect_mon_comm_bal_data_part (
par_report_eff_date_start DATE DEFAULT NULL, --dd/mm/yyyy;
par_report_eff_date_end DATE DEFAULT NULL) --dd/mm/yyyy;
is
v_report_eff_date_start DATE;
v_report_eff_date_end DATE;
BEGIN
IF par_report_eff_date_start IS NULL
THEN
-- Oracle job runs at the beginning of each month
select trunc(trunc(sysdate,'Mon')-1,'Mon')
into v_report_eff_date_start
from dual; -- Start of month Var
ELSIF par_report_eff_date_start IS NOT NULL AND par_report_eff_date_start = to_char(par_report_eff_date_start, 'fxdd/mm/yyyy')
THEN
v_report_eff_date_start := par_report_eff_date_start;
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_start || 'Is The Start Date');
ELSE
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_start || 'Is is the wrong format, needs tp be in dd/mm/yyyy');
GOTO the_end;
END IF;
IF par_report_eff_date_end IS NULL
THEN
-- Oracle job runs at the beginning of each month
select trunc(sysdate,'MM')-1
into v_report_eff_date_end
from dual; -- Start of month Var
ELSIF par_report_eff_date_end IS NOT NULL AND par_report_eff_date_end = to_char(par_report_eff_date_end, 'fxdd/mm/yyyy')
THEN
v_report_eff_date_end := par_report_eff_date_end;
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_end || 'Is The Start Date');
ELSE
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_end || 'Is is the wrong format, needs tp be in dd/mm/yyyy');
GOTO the_end;
END IF;
END;
您不想将 date
转换为 date
。你想把它转换成一个字符串。所以尝试:
to_char(par_report_eff_date_start, 'fxdd-mm-yyyy')
我不确定其余的逻辑应该做什么。但是,您使用 to_date()
将值 转换为 日期,并使用 to_char()
将值转换为字符串。
我注意到您有参数 par_report_eff_date_start 和一个变量 v_report_eff_date_start。您可能想要比较以下行中的那些:
ELSIF par_report_eff_date_start 不为空且 par_report_eff_date_start = to_char(par_report_eff_date_start, 'fxdd/mm/yyyy')
但现在您要将日期 参数 与从参数值派生的文本值进行比较。我不认为那是你想要的。 日期只是一个日期,在将其转换为另一种数据类型(如 VARCHAR2)时,您只需考虑格式掩码。 那么为什么不使用:
ELSIF par_report_eff_date_start 不是 NULL AND trunc(par_report_eff_date_start) = trunc(sysdate, 'Mon')
我已经将 trunc() 添加到参数值中,并且因为您想要每月的第一天(我猜!!),trunc(sysdate, 'Mon') 就可以了。
谢谢你 Gordon,我想我已经找到解决方法了。
procedure collect_mon_comm_bal_data_part (
par_report_eff_date_start VARCHAR2 DEFAULT NULL, --dd/mm/yyyy;
par_report_eff_date_end VARCHAR2 DEFAULT NULL) --dd/mm/yyyy; is
v_report_eff_date_start DATE; v_report_eff_date_end DATE;
BEGIN
IF par_report_eff_date_start IS NULL
THEN
-- Oracle job runs at the beginning of each month
select trunc(trunc(sysdate,'Mon')-1,'Mon')
into v_report_eff_date_start
from dual; -- Start of month Var
ELSIF par_report_eff_date_start IS NOT NULL AND to_date(par_report_eff_date_start, 'dd/mm/yyyy') = to_date(par_report_eff_date_start,'fxdd/mm/yyyy')
THEN
v_report_eff_date_start := to_date(par_report_eff_date_start, 'dd/mm/yyyy');
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_start || 'Is The Start Date');
ELSE
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_start || 'Is is the wrong format, needs tp be in dd/mm/yyyy');
GOTO the_end; END IF;
IF par_report_eff_date_end IS NULL
THEN
-- Oracle job runs at the beginning of each month
select trunc(sysdate,'MM')-1
into v_report_eff_date_end
from dual; -- Start of month Var
ELSIF par_report_eff_date_end IS NOT NULL AND to_date(par_report_eff_date_end, 'dd/mm/yyyy') = to_date(par_report_eff_date_end,'fxdd/mm/yyyy')
THEN
v_report_eff_date_end := to_date(par_report_eff_date_end, 'dd/mm/yyyy');
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_end || 'Is The Start Date');
ELSE
DBMS_OUTPUT.PUT_LINE(par_report_eff_date_end || 'Is is the wrong format, needs tp be in dd/mm/yyyy');
GOTO the_end; END IF;
因此,如果参数为空,我希望它默认为上个月的每月 运行。我希望它 运行 对于选定的日期,如果它们在执行时手动输入,这样我可以 运行 它一年的时间来建立适当的数据样本,该样本将被更新随着它的变化向前发展。
我曾尝试传递虚假日期和空日期,但它们按预期命中了一个月数据的异常或 运行,所以这对我有用。
再次感谢大家,我真的帮了大忙!