Sql 从传递标识符1,2,3的日期间隔中选择与日期对应的特定日期
我试图从一个间隔日期中获得天数。示例:如果我给出的初始日期为2017年6月21日至2017年7月21日,我只想从该日期间隔中选择星期三和星期五,那么如何在oracle db中实现该日期 谢谢你的帮助 更新Sql 从传递标识符1,2,3的日期间隔中选择与日期对应的特定日期,sql,oracle,Sql,Oracle,我试图从一个间隔日期中获得天数。示例:如果我给出的初始日期为2017年6月21日至2017年7月21日,我只想从该日期间隔中选择星期三和星期五,那么如何在oracle db中实现该日期 谢谢你的帮助 更新 CREATE OR REPLACE PROCEDURE "CHAIRA"."PR_SAVEROOMS" (v_return OUT SYS_REFCURSOR,INIDATE IN VARCHAR2,ENDDATE IN VARCHAR2,DAYS IN NUMBER) AS
CREATE OR REPLACE PROCEDURE "CHAIRA"."PR_SAVEROOMS"
(v_return OUT SYS_REFCURSOR,INIDATE IN VARCHAR2,ENDDATE IN VARCHAR2,DAYS IN NUMBER) AS
v_error EXCEPTION;
v_notificacion t_notificacion;
-- variable del tipo varray[3] definida asi: [tipoNotificacion: |notificacion|notificacionPin|error|errorPin|advertencia|advertenciaPin|][tituloNotificacion][mensajeNotificacion]
VARIABLE startDate varchar2;
VARIABLE endDate varchar2;
BEGIN
:startDate := INIDATE;
:endDate := ENDDATE;
SELECT day
FROM (
SELECT DATE TO_DATE(startDate, 'DD/MM/YYYY') + LEVEL - 1 as day
FROM DUAL
CONNECT BY DATE TO_DATE(startDate, 'DD/MM/YYYY') + LEVEL - 1 <= DATE TO_DATE(endDate, 'DD/MM/YYYY')
)
WHERE day - TRUNC( day, 'IW' ) IN ( 2, 4 );
v_notificacion := t_notificacion('notificacion','Información','Mensaje por defecto');
OPEN v_return FOR SELECT v_notificacion(1) "_TIPO", v_notificacion(2) "_TITULO",v_notificacion(3)"_MENSAJE" FROM DUAL;
EXCEPTION
WHEN v_error THEN
RAISE_APPLICATION_ERROR(-20333,v_notificacion(1)||'*'||v_notificacion(2)||'*'||v_notificacion(3)||'*');
ROLLBACK;
END;
我已经根据MT0建议进行了更新&仍然会导致错误
我将VARCHAR DATE的格式设置为DD/MM/YYYY…这将获得所有日期:
SELECT DATE '2017-06-21' + LEVEL - 1 as day
FROM DUAL
CONNECT BY DATE '2017-06-21' + LEVEL - 1 <= DATE '2017-07-21';
更新:
添加绑定参数:
CREATE OR REPLACE PROCEDURE "CHAIRA"."PR_SAVEROOMS"(
v_return OUT SYS_REFCURSOR,
INIDATE IN VARCHAR2,
ENDDATE IN VARCHAR2,
DAYS IN NUMBER
)
AS
v_error EXCEPTION;
v_notificacion t_notificacion;
v_wednesdays_and_fridays SYS.ODCIDATELIST;
BEGIN
SELECT day
BULK COLLECT INTO v_wednesdays_and_fridays
FROM (
SELECT TO_DATE(iniDate, 'DD/MM/YYYY') + LEVEL - 1 as day
FROM DUAL
CONNECT BY TO_DATE(iniDate, 'DD/MM/YYYY') + LEVEL - 1 <= TO_DATE(endDate, 'DD/MM/YYYY')
)
WHERE day - TRUNC( day, 'IW' ) IN ( 2, 4 );
v_notificacion := t_notificacion('notificacion','Información','Mensaje por defecto');
OPEN v_return FOR
SELECT v_notificacion(1) "_TIPO",
v_notificacion(2) "_TITULO",
v_notificacion(3) "_MENSAJE"
FROM DUAL;
EXCEPTION
WHEN v_error THEN
RAISE_APPLICATION_ERROR(-20333,v_notificacion(1)||'*'||v_notificacion(2)||'*'||v_notificacion(3)||'*');
ROLLBACK;
END;
/
由于我们使用的是sysdate,如果您在不同的日期运行脚本,您应该调整一些内容
select * from (SELECT TRUNC (SYSDATE + (ROWNUM*7)) dt
FROM DUAL
CONNECT BY ROWNUM < 100 ) where dt between '21-JUN-17 00:00:00' and '21-JUL-17 00:00:00'
;
添加你的表结构你说的表结构是什么意思?这不只是过滤星期三和星期五,它取决于未来日期范围内的日期。如果我替换参数的初始和最终日期,它将导致错误。我怎样才能解决这个问题@MT0@HARRY已更新。我已更新我的帖子,但仍然导致错误@MT0@HARRY你不需要大喊大叫。更新-您没有对值执行任何操作,但它应该编译。
select * from (SELECT TRUNC (SYSDATE + (ROWNUM*7)) dt
FROM DUAL
CONNECT BY ROWNUM < 100 ) where dt between '21-JUN-17 00:00:00' and '21-JUL-17 00:00:00'
;