OEBS API: Обновляем имя поставщика

22 Ноябрь 2012 Нет комментариев

Скрипт обновления имени и альтернативного имени поставщика.
Убираем лишние пробелы в конце и начале имени.

declare
  l_organization_rec  HZ_PARTY_V2PUB.ORGANIZATION_REC_TYPE;
  l_party_rec         HZ_PARTY_V2PUB.PARTY_REC_TYPE;
  x_profile_id        NUMBER;
  --
  l_success_count NUMBER := 0;
  l_failure_count NUMBER := 0;
  l_all_count     NUMBER := 0;
  --
  x_return_status VARCHAR2(1);
  x_msg_count     NUMBER;
  x_msg_data      VARCHAR2(4000);  
begin
  
  fnd_global.apps_initialize(1, 20639, 200); --Диспетчер кредиторов - Кредиторы
  for i in (SELECT vendor_id, 
                   vendor_name, 
                   vendor_name_alt, 
                   party_id, 
                  (select hp.object_version_number 
                   from hz_parties hp where party_id = pv.party_id
                  ) as object_version_number
            FROM po_vendors pv
            WHERE 1=1
                  and (vendor_name like '% ' or vendor_name like ' %'
                      or vendor_name_alt like '% '
                      or vendor_name_alt like ' %')
            )
  loop
    l_all_count := l_all_count + 1;
    
    --dbms_output.put_line('vendor_id='||i.vendor_id);
    l_party_rec.party_id                          := i.party_id;
    l_organization_rec.organization_name          := trim(i.vendor_name);
    l_organization_rec.organization_name_phonetic := trim(i.vendor_name);
    l_organization_rec.party_rec                  := l_party_rec;
    HZ_PARTY_V2PUB.update_organization(p_init_msg_list               => FND_API.G_TRUE,
                                       p_organization_rec            => l_organization_rec,
                                   p_party_object_version_number => i.object_version_number,
                                       x_profile_id                  => x_profile_id,
                                       x_return_status               => x_return_status,
                                       x_msg_count                   => x_msg_count,
                                       x_msg_data                    => x_msg_data);
      
    --dbms_output.put_line(x_return_status);
    if (x_return_status <> 'S') then
      l_failure_count := l_failure_count + 1;
      fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
                                p_count   => x_msg_count,
                                p_data    => x_msg_data);
                                      
      if x_msg_count = 1 then
        dbms_output.put_line('ERROR vendor_id='||i.vendor_id
                             ||'; vendor_name="'||i.vendor_name||'"; '|| x_msg_data );
      else
        FOR j IN 1 .. x_msg_count LOOP
          x_msg_data := fnd_msg_pub.get(fnd_msg_pub.g_next,fnd_api.g_false);
          dbms_output.put_line('ERROR vendor_id='||i.vendor_id
                               ||'; vendor_name="'||i.vendor_name||'"; '|| x_msg_data );
        END LOOP;
      end if;
    else
      l_success_count := l_success_count + 1;
    end if;
      
  end loop;  
    
  dbms_output.put_line('+--------------------------------------+'); 
  dbms_output.put_line('Обновление поставщиков');   
  dbms_output.put_line('  Общее количество    : '||l_all_count);
  dbms_output.put_line('  Обновлено успешно   : '||l_success_count);      
  dbms_output.put_line('  Не удалось обновить : '||l_failure_count);
  dbms_output.put_line('+--------------------------------------+');    
  
  COMMIT;
                            
end;

Oracle Создание PARTITION BY RANGE по полю DATE

21 Ноябрь 2012 1 комментарий

Скрипт помогающий создать PARTITION BY RANGE по полю DATE

SET LINESIZE 150
SET SERVEROUTPUT ON SIZE 1000000
WHENEVER SQLERROR CONTINUE
SPOOL C:\create_partition_date.log
declare
 iter number;
 l_date_start date := to_date('01-11-2011','dd-mm-yyyy');
 l_date_end   date := to_date('01-01-2023','dd-mm-yyyy');
 l_name_part  varchar2(20) := 'TEST';
 l_part_field varchar2(20) := 'MY_DATE';
begin
 dbms_output.put_line('PARTITION BY RANGE('||l_part_field||')');
 dbms_output.put_line('(');
 dbms_output.put_line(' PARTITION '||l_name_part
                        ||'_MIN     VALUES LESS THAN (to_date('''
                        ||to_char(add_months(l_date_start,-1),'dd-mm-yyyy')
                        ||''',''dd-mm-yyyy''))');
 for j in (
              with t as (
              select l_date_start d1,
                     l_date_end d2
              from dual
            )
            --
            select decode(level,1,d1,
                          trunc(add_months(d1,level-1),'mm')
                         ) as date_from
            from t
            connect by add_months(trunc(d1,'mm'),level-1) <= d2
           ) 
 loop
   dbms_output.put_line(',PARTITION '||l_name_part||'_'
                        ||to_char(add_months(j.date_from,-1),'mm_yyyy')
                        ||' VALUES LESS THAN (to_date('''
                        ||to_char(j.date_from,'dd-mm-yyyy')
                        ||''',''dd-mm-yyyy''))');
 end loop;
 dbms_output.put_line(',PARTITION '||l_name_part
                      ||'_MAX     VALUES LESS THAN (MAXVALUE)'); 
 dbms_output.put_line(')');
end;
/
spool off

PARTITION BY RANGE(MY_DATE)
(
 PARTITION TEST_MIN     VALUES LESS THAN (to_date('01-10-2011','dd-mm-yyyy'))
,PARTITION TEST_10_2011 VALUES LESS THAN (to_date('01-11-2011','dd-mm-yyyy'))
,PARTITION TEST_11_2011 VALUES LESS THAN (to_date('01-12-2011','dd-mm-yyyy'))
...
,PARTITION TEST_11_2022 VALUES LESS THAN (to_date('01-12-2022','dd-mm-yyyy'))
,PARTITION TEST_12_2022 VALUES LESS THAN (to_date('01-01-2023','dd-mm-yyyy'))
,PARTITION TEST_MAX     VALUES LESS THAN (MAXVALUE)
)
 
PL/SQL procedure successfully completed
SQL> spool off
Stopped spooling to C:\create_partition_date.log

OEBS API: Создание расчетного счета на отделении поставщика

20 Ноябрь 2012 Нет комментариев

Пример скрипта для создания расчетного счета на отделении поставщика:

DECLARE
  l_bank_acct_rec       apps.iby_ext_bankacct_pub.extbankacct_rec_type;
  out_mesg              apps.iby_fndcpt_common_pub.result_rec_type;
  l_acct                NUMBER;
  l_bank_id             NUMBER := 0; --!!! установить значение
  l_branch_id           NUMBER := 0; --!!!
  l_acct_owner_party_id NUMBER := 0; --!!!
  l_supplier_site_id    NUMBER := 0; --!!!
  l_party_site_id       NUMBER := 0; --!!!
  --
  x_return_status       VARCHAR2(1);
  x_msg_count           NUMBER;
  x_msg_data            VARCHAR2(4000);  
BEGIN
  FND_MSG_PUB.initialize;
  
  fnd_global.apps_initialize(1, 20639, 200); --Диспетчер кредиторов - Кредиторы

  l_bank_acct_rec.bank_id               := l_bank_id; 
  l_bank_acct_rec.branch_id             := l_branch_id;
  l_bank_acct_rec.country_code          := 'RU';
  l_bank_acct_rec.bank_account_name     := '3321615678101831567890';
  l_bank_acct_rec.bank_account_num      := 3321615678101831567890;
  l_bank_acct_rec.acct_owner_party_id   := l_acct_owner_party_id;
  l_bank_acct_rec.currency              := 'RUB';
  l_bank_acct_rec.object_version_number := 1.0;
  l_bank_acct_rec.start_date            := sysdate;
  l_bank_acct_rec.foreign_payment_use_flag := 'Y';
  l_bank_acct_rec.payment_factor_flag      := 'N';

  apps.iby_ext_bankacct_pub.create_ext_bank_acct(p_api_version       => 1.0,
                                                 p_init_msg_list     => 'F',
                                                 p_ext_bank_acct_rec => l_bank_acct_rec,
                                                 p_association_level => 'SS',
                                                 p_supplier_site_id  => l_supplier_site_id,
                                                 p_party_site_id     => l_party_site_id,
                                                 p_org_id            => 82,
                                                 p_org_type          => 'OPERATING_UNIT',
                                                 x_acct_id           => l_acct,
                                                 x_return_status     => x_return_status,
                                                 x_msg_count         => x_msg_count,
                                                 x_msg_data          => x_msg_data,
                                                 x_response          => out_mesg);
  COMMIT;  
                                 
  dbms_output.put_line('x_return_status='||x_return_status);
  dbms_output.put_line('out_mesg.Result_Code     ='||out_mesg.Result_Code);
  dbms_output.put_line('out_mesg.Result_Category ='||out_mesg.Result_Category);
  dbms_output.put_line('out_mesg.Result_Message  ='||out_mesg.Result_Message);
  
  if x_return_status <> 'S' THEN
    fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
                              p_count   => x_msg_count,
                              p_data    => x_msg_data);
                                
    dbms_output.put_line(chr(10)||'x_msg_count='||x_msg_count);
    if x_msg_count = 1 then
      dbms_output.put_line(x_msg_data);
    else
      FOR i IN 1 .. x_msg_count LOOP
        dbms_output.put_line(fnd_msg_pub.get(fnd_msg_pub.g_next,
                                             fnd_api.g_false));
      END LOOP;
    end if;    
  end if;
end;

OEBS API: Создание поставщика и отделения

19 Ноябрь 2012 Нет комментариев

OEBS Пример использования API для создания поставщика и отделения поставщика:

declare
  l_vendor_rec      AP_VENDOR_PUB_PKG.r_vendor_rec_type;
  l_vendor_site_rec AP_VENDOR_PUB_PKG.r_vendor_site_rec_type;
  x_vendor_id       number;
  x_party_id        number;
  x_vendor_site_id  number;
  x_party_site_id   number;
  x_location_id     number;
  l_party_site_id   number;
  --
  x_return_status VARCHAR2(1);
  x_msg_count     NUMBER;
  x_msg_data      VARCHAR2(4000);
begin
  l_vendor_rec.SEGMENT1     := '1234575';
  l_vendor_rec.VENDOR_NAME  := 'MYTESTSUPPLIER2';
  l_vendor_rec.SUMMARY_FLAG := 'N';
  l_vendor_rec.ENABLED_FLAG := 'Y';

  AP_VENDOR_PUB_PKG.Create_Vendor(p_api_version   => 1,
                                  x_return_status => x_return_status,
                                  x_msg_count     => x_msg_count,
                                  x_msg_data      => x_msg_data,
                                  p_vendor_rec    => l_vendor_rec,
                                  x_vendor_id     => x_vendor_id,
                                  x_party_id      => x_party_id);

  if (x_return_status <> 'S') then
    dbms_output.put_line('ERROR in supplier creation');
    dbms_output.put_line('--------------------------------------');
  
    if x_msg_count = 1 then
      dbms_output.put_line(x_msg_data);
    else
      FOR i IN 1 .. x_msg_count LOOP
        dbms_output.put_line(fnd_msg_pub.get(fnd_msg_pub.g_next,
                                             fnd_api.g_false));
      END LOOP;
    end if;
  else
  
    l_vendor_site_rec.vendor_id            := x_vendor_id;
    l_vendor_site_rec.VENDOR_SITE_CODE     := 'MYHOME';
    l_vendor_site_rec.org_id               := 82;
    l_vendor_site_rec.COUNTRY              := 'RU';
    l_vendor_site_rec.ADDRESS_LINE1        := 'Lenina';
    l_vendor_site_rec.PURCHASING_SITE_FLAG := 'Y';
    l_vendor_site_rec.PAY_SITE_FLAG        := 'Y';
  
    AP_VENDOR_PUB_PKG.Create_Vendor_Site(p_api_version     => 1,
                                         x_return_status   => x_return_status,
                                         x_msg_count       => x_msg_count,
                                         x_msg_data        => x_msg_data,
                                         p_vendor_site_rec => l_vendor_site_rec,
                                         x_vendor_site_id  => x_vendor_site_id,
                                         x_party_site_id   => x_party_site_id,
                                         x_location_id     => x_location_id);
  
    if (x_return_status <> 'S') then
      dbms_output.put_line('ERROR in supplier site creation');
      dbms_output.put_line('--------------------------------------');
    
      if x_msg_count = 1 then
        dbms_output.put_line(x_msg_data);
      else
        FOR i IN 1 .. x_msg_count LOOP
          dbms_output.put_line(fnd_msg_pub.get(fnd_msg_pub.g_next,
                                               fnd_api.g_false));
        END LOOP;
      end if;
    else
      dbms_output.put_line('Supplier Site Created!');
    end if;
  
  end if;
  
  commit;
end;

OEBS Программа – сторнирование журналов SQLGL GLPREV

13 Ноябрь 2012 Нет комментариев

ОЕБС Пример вызова параллельной программы для сторнирования журналов

-- -------------------------------------------------------------------------------
-- Сторнирование журнала
PROCEDURE reverse_journals(x_return_status OUT VARCHAR2
                          ,x_mess          OUT VARCHAR2) 
IS
  TYPE t_integers IS TABLE OF INTEGER INDEX BY PLS_INTEGER;
  l_request_ids   t_integers;
  l_result        BOOLEAN := TRUE;
  l_access_set_id NUMBER;
BEGIN
  write_log('START REVERSE_JOURNALS');
  x_return_status := 'E';
  l_access_set_id := fnd_profile.value('GL_ACCESS_SET_ID');
  FOR c_je IN (SELECT jh.je_header_id
                     ,jh.rowid        AS row_id
                     ,jh.name         AS journal_name
                     ,b.name          AS batch_name
                 FROM gl.gl_je_headers jh, gl_je_batches b
                WHERE 1 = 1
                  AND jh.je_batch_id = b.je_batch_id
                     --
                  AND jh.ledger_id = G_LEDGER_ID
                  AND jh.je_source = G_JE_SOURCE_NAME
                  AND jh.je_category = G_JE_CATEGORY_NAME
                  AND jh.period_name = P_PERIOD_NAME
                  AND (b.name LIKE g_bath_name_in || '%' OR
                      b.name LIKE g_bath_name_out || '%')
                  AND (jh.name LIKE g_jh_name_in || '%' OR
                      jh.name LIKE g_jh_name_out || '%')
                  AND ( --Неотсторнированные журналы
                       (jh.accrual_rev_status IS NULL AND
                 -- сторно на сторно на сторно ...
                       jh.reversed_je_header_id IS NULL) OR 
                       (jh.accrual_rev_status IS NULL AND
                       jh.reversed_je_header_id IS NOT NULL AND
                       MOD((SELECT COUNT(*)
                              FROM gl_je_headers jh0
                             START WITH jh0.je_header_id = jh.je_header_id
                            CONNECT BY jh0.je_header_id = PRIOR
                                       jh0.reversed_je_header_id)
                           ,2) != 0))
                ORDER BY jh.je_header_id)
  LOOP
    write_log('  Сторнирование журнала "' || c_je.journal_name ||
           '" из пакета "' || c_je.batch_name || '"');
    UPDATE gl_je_headers
       SET accrual_rev_flag             = 'Y'
          ,accrual_rev_period_name      = P_PERIOD_NAME
          ,accrual_rev_change_sign_flag = 'Y'
          ,accrual_rev_effective_date   = SYSDATE
     WHERE ROWID = c_je.row_id;
    --
    l_request_ids(l_request_ids.COUNT + 1) :=
     fnd_request.submit_request(application => 'SQLGL'
                                ,program     => 'GLPREV'
                                ,description => NULL
                                ,start_time  => NULL
                                ,sub_request => FALSE
                                ,argument1   => l_access_set_id
                                ,argument2   => c_je.je_header_id);
    COMMIT;
    IF l_request_ids(l_request_ids.COUNT) = 0 THEN
      write_log('Ошибка при отправке параллельного запроса Сторнирование журналов.');
      l_request_ids.DELETE(l_request_ids.COUNT);
      l_result := FALSE;
      --exit;
    END IF;
  END LOOP;
  --
  WHILE l_request_ids.COUNT > 0
  LOOP
    -- описание функции http://apps-oracle.ru/fnd_request_exec/#WAIT_CONCURRENT
    if NOT (wait_concur(l_request_ids(l_request_ids.FIRST),x_mess)) then
      write_log(x_mess);
      l_result := FALSE;
      exit;
    end if;
    l_request_ids.DELETE(l_request_ids.FIRST);
  END LOOP;
  write_log('END REVERSE_JOURNALS' || chr(10));
  --
  IF l_result THEN
    x_return_status := 'S';
    x_mess          := 'Сторнирование журналов завершено успешно.';
    RETURN;
  ELSE
    x_return_status := 'E';
    x_mess          := 'Сторнирование журналов завершено с ошибками. '||x_mess;
    RETURN;
  END IF;
  --
END reverse_journals;

OEBS Программа – проведение журналов SQLGL GLPPOSS

13 Ноябрь 2012 Нет комментариев

ОЕБС Пример вызова параллельной программы для проведения журналов

-- -----------------------------------------------------
-- Проведение журналов
-- -----------------------------------------------------
PROCEDURE post_journals(p_ledger_id NUMBER
                       ,p_group_id  NUMBER
                       ,p_period    VARCHAR2
                       ,p_rev       NUMBER
                       ,x_return_status OUT VARCHAR2
                       ,x_mess          OUT VARCHAR2)
IS
  l_request_id           INTEGER;
  l_posting_run_id       INTEGER;
  l_chart_of_accounts_id INTEGER;
  l_access_set_id        INTEGER;
BEGIN
  write_log('START POST_JOURNALS');
  x_return_status  := 'E';
  l_posting_run_id := gl_je_posting_s.nextval;
  IF (p_rev = 0) THEN
    UPDATE gl_je_batches b
       SET status               = 'S'
          ,approval_status_code = 'Z' -- пакет должен быть утвержден
          ,posting_run_id       = l_posting_run_id
     WHERE b.status = 'U'
       AND b.GROUP_ID = p_group_id;
  ELSIF (p_rev = 1) THEN
    UPDATE gl_je_batches b
       SET status               = 'S'
          ,approval_status_code = 'Z' -- пакет должен быть утвержден
          ,posting_run_id       = l_posting_run_id
     WHERE b.status = 'U'
       AND EXISTS
     (SELECT 1
              FROM gl_je_batches jb, gl_je_headers h, gl_je_headers hr
             WHERE jb.je_batch_id = h.je_batch_id
               AND h.je_header_id = hr.reversed_je_header_id
               AND (h.name LIKE G_JH_NAME_IN || '%' OR
                   h.name LIKE G_JH_NAME_OUT || '%')
               AND h.period_name = p_period
               AND h.ledger_id = p_ledger_id
               AND hr.je_batch_id = b.je_batch_id)
       AND 2 = 2;
  END IF;
  write_log('  UPDATE ' || SQL%ROWCOUNT || ' rows in GL_JE_BATCHES');
  IF (SQL%ROWCOUNT > 0) THEN
    --
    SELECT l.chart_of_accounts_id, a.access_set_id
      INTO l_chart_of_accounts_id, l_access_set_id
      FROM gl_ledgers l, gl_access_sets a
     WHERE 1 = 1
       AND l.ledger_id = p_ledger_id
       AND a.default_ledger_id = l.ledger_id
       AND a.chart_of_accounts_id = l.chart_of_accounts_id
       AND a.period_set_name = l.period_set_name
       AND a.accounted_period_type = l.accounted_period_type;
 
    l_request_id := fnd_request.submit_request(
                 application => 'SQLGL'
                ,program     => 'GLPPOSS'
                ,description => NULL
                ,start_time  => NULL
                ,sub_request => FALSE
                ,argument1   => p_ledger_id
                ,argument2   => TO_CHAR(fnd_profile.value('GL_ACCESS_SET_ID'))
                ,argument3   => l_chart_of_accounts_id
                ,argument4   => l_posting_run_id);
 
    COMMIT;
    
    IF l_request_id = 0 THEN
      x_mess := 'Ошибка при отправке запроса проводки журналов';
      RETURN;
    END IF;
    
    -- описание функции http://apps-oracle.ru/fnd_request_exec/#WAIT_CONCURRENT
    if NOT (wait_concur(l_request_id,x_mess)) then
      write_log(x_mess);
      RETURN;
    end if;

  END IF;
 
  x_return_status := 'S';
  write_log('END POST_JOURNALS' || chr(10));
  RETURN;
EXCEPTION
  WHEN OTHERS THEN
    x_mess := 'Ошибка при запуске запроса проводки журналов: ' || SQLERRM;
END;

OEBS Программа — импорт журналов SQLGL GLLEZLSRS

12 Ноябрь 2012 Нет комментариев

Пример вызова параллельной программы для импорта журналов

-- -----------------------------------------------------
-- Импорт журналов
-- -----------------------------------------------------
PROCEDURE import_journals(x_return_status OUT VARCHAR2
                         ,x_mess          OUT VARCHAR2
                         ) 
IS
  l_flag_exist     NUMBER;
  l_request_id     NUMBER;
BEGIN
  x_return_status := 'E';
  write_log('START IMPORT_JOURNALS');
    
  -- проверка, что есть вставленные строки
  SELECT COUNT(1) INTO l_flag_exist FROM gl_interface t
  WHERE group_id = fnd_global.conc_request_id;
   
  IF (l_flag_exist != 0) THEN
    write_log('Запуск программы "Программа - импорт журналов"');
    l_request_id := apps.fnd_request.submit_request(
                              'SQLGL'
                             ,'GLLEZLSRS'
                             ,NULL
                             ,SYSDATE
                             ,FALSE
                             ,fnd_profile.value('GL_ACCESS_SET_ID') --Data Access Set ID
                             ,G_JE_SOURCE_NAME --Source
                             ,G_LEDGER_ID      --Ledger
                             ,fnd_global.conc_request_id --Group ID
                             ,'N' --Post Errors to Suspense
                             ,'N' --Create Summary Journals
                             ,'W' --Import Descriptive Flexfields
                                                   );
    COMMIT;
    
    IF l_request_id = 0 THEN
      x_mess := 'При отправке запроса произошла ошибка. Номер запроса:' || l_request_id;  
      write_log(x_mess);
      RETURN;
    END IF;
    -- описание функции http://apps-oracle.ru/fnd_request_exec/#WAIT_CONCURRENT
    if NOT (wait_concur(l_request_id,x_mess)) then 
      write_log(x_mess);
      RETURN;
    end if;
    
  END IF;
  
  write_log('END IMPORT_JOURNALS' || chr(10));
  x_return_status := 'S';
END;

OEBS API Параллельные программы — отправка, ожидание, скрытый режим

9 Ноябрь 2012 6 comments

OEBS API Запуск параллельной программы

declare
  l_request_id NUMBER;
  --
  p_app_name     VARCHAR2(100);
  p_request_name VARCHAR2(100);
begin
  l_request_id:=apps.fnd_request.submit_request
                         (application => p_app_name     -- код приложения
                         ,program     => p_request_name -- код параллельной программы
                         ,description => NULL           -- описание
                         ,start_time  => NULL           -- когда запустить программу
                         ,sub_request => FALSE          -- признак дочерней программы
                         ,argument1   => 1              -- параметр параллельной программы
                         -- ...
                         --,argument100 =>
                         );
  COMMIT;
  if l_request_id = 0 then
    --write_log('При отправке запроса произошла ошибка');
    raise fnd_api.g_exc_error;
  end if;                                               
end;

Если,
start_time = NULL, то запуск происходит сразу.
start_time = fnd_date.date_to_canonical(sysdate + (1/26/60)*5) — запуск через 5 минут

Читать дальше про “OEBS API Параллельные программы — отправка, ожидание, скрытый режим” »

EXCEL — некорректная точность чисел с десятичной точкой

Случайно наткнулся на то, что EXCEL2007/2010 число 2,01 хранит как 2.0099999999999998

Пример: Создаем excel файл и прописываем в ячейки числовые значения с точкой

Сохраняем файл как «Таблица XML 2003» и открываем на просмотр в текстовом редакторе:
Читать дальше про “EXCEL — некорректная точность чисел с десятичной точкой” »

Categories: Oracle e-Business Suite Tags: ,

Даты в oracle — получить первый/последний день

6 Ноябрь 2012 1 комментарий
with t as (select trunc(sysdate) d from dual)
--
select 'ГОД - первый день' descr,trunc(d,'YY') new_date from t
union all
select 'ГОД - последний день', add_months(trunc(d,'YY'),12)-1 from t
union all
select 'КВАРТАЛ - первый день', trunc(d,'Q') from t
union all
select 'КВАРТАЛ - последний день', trunc(add_months(d, 3), 'Q')-1 from t
union all
select 'МЕСЯЦ - первый день' ,trunc(d,'MM') from t
union all
-- LAST_DAY не изменяет время
select 'МЕСЯЦ - последний день',last_day(d) from t 
union all
-- какой день недели считается первым, зависит от параметра NLS_TERRITORY
select 'НЕДЕЛЯ - первый день', trunc(d,'D') from t 
union all
select 'НЕДЕЛЯ - последний день', trunc(d,'D')+6 from t

DESCR                    NEW_DATE
------------------------ -----------
ГОД - первый день        01.01.2012
ГОД - последний день     31.12.2012
КВАРТАЛ - первый день    01.10.2012
КВАРТАЛ - последний день 31.12.2012
МЕСЯЦ - первый день      01.11.2012
МЕСЯЦ - последний день   30.11.2012
НЕДЕЛЯ - первый день     05.11.2012
НЕДЕЛЯ - последний день  11.11.2012
 
8 rows selected
SQL> select (sysdate-trunc(sysdate-1)) day to second + time '00:00:00' as diff_time from dual;
 
DIFF_TIME
---------
15:32:2
Categories: SQL Tags: , , , ,