[ОТВЕТИТЬ]
15.06.2010 11:16
PavelGS
 
Не могу разобраться с функцией decode
Мне нужно получить ближайший нечетный понедельник (не четная дата) после определенной даты + 7 дней
15.06.2010 12:41
vdm
 
Если по частям, то просто следующий понедельник
my_date2 := my_date+8-TO_NUMBER(TO_CHAR(my_date, 'D'))
Как определить, что эта дата четная и прибавить неделю - думаю понимаешь. Но в один запрос это городить неудобно.

Что такое decode - описаний же полно.
decode(параметр,
значение_параметра_1, вернуть_что_то_№1,
значение_параметра_2, вернуть_что_то_№2,
значение_параметра_3, вернуть_что_то_№3,
и т.д.,
иначе_вернуть_что_то_№xx)
15.06.2010 14:23
PavelGS
 
Родил следующее
Код:
 SELECT MIN(DTT) AS DT FROM(
    SELECT DTT FROM(
        select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date('13.06.2010')+7 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date('13.06.2010')+8 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date('13.06.2010')+9 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date('13.06.2010')+10 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date('13.06.2010')+11 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date('13.06.2010')+12 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date('13.06.2010')+13 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date('13.06.2010')+14 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date('13.06.2010')+15 dt from dual)
) WHERE mod(TO_NUMBER(SUBSTR(DTT,0,2)),2)<>0)
Не очень красиво, но работает :)
15.06.2010 15:30
John Doe
 
какой-то ужас :)
попробуй так (считал от текущего, меняй sysdate на что тебе надо), особо не тестировал, проверь:
Цитата:
with monday as (select sysdate+15-TO_NUMBER(TO_CHAR(sysdate, 'D')) "mon" from dual)
select decode(mod(TO_NUMBER(TO_CHAR("mon", 'DD')),2),0,"mon"+7,"mon")from monday
15.06.2010 16:13
PavelGS
 
Цитата:
John Doe какой-то ужас :)
попробуй так (считал от текущего, меняй sysdate на что тебе надо), особо не тестировал, проверь:
Никак не могу победить, не работает :(
15.06.2010 16:15
PavelGS
 
Пробовал свой код добавить тоже не работает в триггере :(

Код:
CREATE OR REPLACE TRIGGER SUPERMAG.LMMATRIXCHANGE
BEFORE DELETE OR INSERT
ON SUPERMAG.SMASSORTMATRIX 
FOR EACH ROW
DECLARE
dayForZak int;
DDATE date;
daten char(10);
BEGIN
SELECT TO_NUMBER(VALUE) into dayForZak FROM SUPERMAG.LMCONFIG WHERE PARM='day_for_vvod';
SELECT TO_CHAR(SYSDATE, 'DD.MM.YYYY') into daten FROM dual;
SELECT TO_DATE(MIN(DTT)) into DDATE FROM(
    SELECT DTT FROM(
              select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date(daten)+7 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date(daten)+8 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date(daten)+9 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date(daten)+10 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date(daten)+11 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date(daten)+12 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date(daten)+13 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date(daten)+14 dt from dual)
        UNION select decode(to_char(dt,'d'),1, dt) AS DTT from (select to_date(daten)+15 dt from dual)
) WHERE mod(TO_NUMBER(SUBSTR(DTT,0,2)),2)<>0);
--Core.FailMsg('&#196;&#224;&#242;&#224;'||DDATE);

if inserting or updating then
INSERT INTO LMMATRIXACTIONS(ARTICLE,ACTIONDATE,OWNER,ACTION,MATRIXID,LOCATION,ZAKDATE) 
VALUES (:New.ARTICLE,SYSDATE,USER,'insert',:New.IDMATRIX,(SELECT STORELOC FROM SMASSORTMATRIXLOC WHERE IDMATRIX=:New.IDMATRIX),DDATE);

else
INSERT INTO LMMATRIXACTIONS(ARTICLE,ACTIONDATE,OWNER,ACTION,MATRIXID,LOCATION) VALUES 
(:Old.ARTICLE,SYSDATE,USER,'delete',:Old.IDMATRIX,(SELECT STORELOC FROM SMASSORTMATRIXLOC WHERE IDMATRIX=:Old.IDMATRIX));
end if;   
END LMMATRIXCHANGE;
/
15.06.2010 16:40
John Doe
 
Пробежал, не увидел слова autonomous transaction - бросил смотреть...
В культурном обществе обычно слово "не работает" расшифровывают.
15.06.2010 17:01
deucel
 
Цитата:
PavelGS Мне нужно получить ближайший нечетный понедельник (не четная дата) после определенной даты + 7 дней
Код:
WITH datelist AS
     (SELECT TO_DATE ('01012010', 'DDMMYYYY') fromdate, TO_DATE ('31122010', 'DDMMYYYY') todate
        FROM DUAL)
SELECT DAY
  FROM (SELECT     fromdate + LEVEL - 1 DAY
              FROM datelist
        CONNECT BY LEVEL <= todate - fromdate + 1)
 WHERE TO_CHAR (DAY, 'D') = 1 AND TO_NUMBER (TO_CHAR (DAY, 'DD')) / 2 != TRUNC (TO_NUMBER (TO_CHAR (DAY, 'DD')) / 2) AND ROWNUM = 1
15.06.2010 17:24
PavelGS
 
Запускаю как есть ругается
Код:
Error at line 1
SQL statement doesn't return rows
15.06.2010 17:46
deucel
 
Цитата:
PavelGS Запускаю как есть ругается

Где?

Код:
SQL*Plus: Release 10.2.0.4.0 - Production on Вт Июн 15 17:44:01 2010

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.


Присоединен к:
Oracle9i Release 9.2.0.8.0 - Production
JServer Release 9.2.0.8.0 - Production

SQL> WITH datelist AS
  2       (SELECT TO_DATE ('01012010', 'DDMMYYYY') fromdate, TO_DATE ('31122010', 'DDMMYYYY') todate
  3          FROM DUAL)
  4  SELECT DAY
  5    FROM (SELECT     fromdate + LEVEL - 1 DAY
  6                FROM datelist
  7          CONNECT BY LEVEL <= todate - fromdate + 1)
  8   WHERE TO_CHAR (DAY, 'D') = 1 AND TO_NUMBER (TO_CHAR (DAY, 'DD')) / 2 != TRUNC (TO_NUMBER (TO_CHAR (DAY, 'DD')) / 2) AND ROWNUM = 1;

DAY
--------
11.01.10

SQL>
15.06.2010 18:04
John Doe
 
Чтобы не было вопросов :)

Код:
SQL> with monday as (select trunc(sysdate)+15-TO_NUMBER(TO_CHAR(trunc(sysdate), 'D')) "mon" from dual)
  2  select decode(mod(TO_NUMBER(TO_CHAR("mon", 'DD')),2),0,"mon"+7,"mon")from monday;

DECODE(M
--------
05.07.10
15.06.2010 18:06
vdm
 
Цитата:
deucel Где?

Эта ошибка - при подключении через клиента от reports 6i.
Он не понимает with.
15.06.2010 19:54
PavelGS
 
сделал пока что так, потом буду пробовать
Код:
CREATE OR REPLACE TRIGGER SUPERMAG.LMMATRIXCHANGE
BEFORE DELETE OR INSERT
ON SUPERMAG.SMASSORTMATRIX 
FOR EACH ROW
DECLARE
dayForZak  int;
i int;
DDATE date;
DTEMP date;
IVT int;
f boolean;
BEGIN
SELECT TO_NUMBER(VALUE) into dayForZak FROM SUPERMAG.LMCONFIG WHERE PARM='day_for_vvod';
DTEMP := TO_DATE('01.01.2010','DD.MM.YYYY');
IVT := 0;
f := false;

     FOR i in 1..366 loop
        if (weekd(DTEMP) = dayForZak) then     
            IVT := IVT + 1;
        end if;
            
            if TO_CHAR(DTEMP,'DD.MM.YYYY') = TO_CHAR(sysdate,'DD.MM.YYYY') then
                f := true;
                end if;
        
                    
        if (weekd(DTEMP) = dayForZak) AND (IVT / 2 <> TRUNC (IVT / 2)) then
            if f = true then
               exit;
            end if;
        end if;  
                
            DTEMP := DTEMP + 1;
    end loop;

   
if inserting or updating then
INSERT INTO LMMATRIXACTIONS(ARTICLE,ACTIONDATE,OWNER,ACTION,MATRIXID,LOCATION,ZAKDATE) 
VALUES (:New.ARTICLE,SYSDATE,USER,'insert',:New.IDMATRIX,(SELECT STORELOC FROM SMASSORTMATRIXLOC WHERE IDMATRIX=:New.IDMATRIX),DTEMP);

else
INSERT INTO LMMATRIXACTIONS(ARTICLE,ACTIONDATE,OWNER,ACTION,MATRIXID,LOCATION) VALUES 
(:Old.ARTICLE,SYSDATE,USER,'delete',:Old.IDMATRIX,(SELECT STORELOC FROM SMASSORTMATRIXLOC WHERE IDMATRIX=:Old.IDMATRIX));
end if;   
END LMMATRIXCHANGE;
/
16.06.2010 11:50
deucel
 
Цитата:
vdm Он не понимает with.
Бывает, попробуй тогда так:

Код:
SELECT DAY
  FROM (SELECT     fromdate + LEVEL - 1 DAY
              FROM (SELECT TO_DATE ('01062010', 'DDMMYYYY') fromdate, TO_DATE ('01062010', 'DDMMYYYY') + 14 todate
                      FROM DUAL)
        CONNECT BY LEVEL <= todate - fromdate + 1)
 WHERE TO_CHAR (DAY, 'D') = 1 AND TO_NUMBER (TO_CHAR (DAY, 'DD')) / 2 != TRUNC (TO_NUMBER (TO_CHAR (DAY, 'DD')) / 2)
--AND ROWNUM = 1
Опции темы


Часовой пояс GMT +3, время: 18:06.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.