Primeiro dia do Mês

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
  

Mensagemem Ter, 28 Dez 2004 10:00 am

Olá pessoal

Tem alguma função que busque o primeiro dia do mês?
(Eu sei que sempre é 1, mas eu não queria fazer cada vez um TO_CHAR pra descobrir)

Exemplo:
Código: Selecionar todos
SQL> select to_date( '01/'||to_char(sysdate, 'mm/yyyy')   , 'dd/mm/yyyy')
  2  from dual;

TO_DATE('
---------
01-DEC-04

1 row selected.

SQL>


Eu queria algo como o LAST_DAY :-o

thanks!
tfg
Localização: Novo Hamburgo - RS

Mensagemem Ter, 28 Dez 2004 10:07 am

Pode usar o TRUNC pra isso!!!

Veja o exemplo simples:
Código: Selecionar todos
SQL> select trunc(sysdate, 'mm') DATA from dual;

DATA
---------
01-DEC-04



Também pode pegar o primeiro dia do ANO!
Código: Selecionar todos
SQL> select trunc(sysdate, 'rr') DATA from dual;

DATA
---------
01-JAN-04
dr_gori
Localização: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered

Mensagemem Qua, 05 Jan 2005 12:29 pm

Cara, complementando o que o dr. falou, eu tenho o costume a funcao First_day que recebe uma data e retorna o primeiro dia do mês, e dentro dela costumo colocar o trunc, que o nosso amigo já passou.
leobbg
Localização: PORTO ALEGRE - RS

Leo BBG Consultor Oracle

Mensagemem Qua, 05 Jan 2005 12:40 pm

leobbg escreveu:eu tenho o costume a funcao First_day


Mas justamente, não existe função FIRST_DAY... (pelo menos não no 9i)
tfg
Localização: Novo Hamburgo - RS

Mensagemem Qua, 05 Jan 2005 1:19 pm

a frase acabou saindo errado... ali eu estava escrevendo eu tenho o costume de criar a funcao First_day que recebe uma data e retorna o primeiro dia do mês, e dentro dela costumo colocar o trunc, que o nosso amigo já passou.
leobbg
Localização: PORTO ALEGRE - RS

Leo BBG Consultor Oracle

Mensagemem Qui, 27 Out 2005 10:58 pm

Código: Selecionar todos
create or replace function first_day(pdata date) return date is
  Result date;
begin
  --
  result := last_day(add_months(pdata, -1)) + 1;
  return(Result);
  --
end first_day;



volta para o oracle
schnu
Localização: Dongguan - Guangdong - China

Mensagemem Sex, 28 Out 2005 12:07 pm

assim também funciona...

Código: Selecionar todos
create or replace function first_day(pdata date) return date is
  result date;
begin
  --
  result := trunc(pdata,'MM');
  return(result);
  --
end first_day;


o trunc com o parametro 'MM' retorna o primeiro dia do mês, como dito nos post anteriores....

[]´s
anderson
Localização: Toledo - PR

Anderson Nuernberg
---

Mensagemem Qua, 02 Nov 2005 12:40 am

Antes de considerar o uso de uma função em um sistema realístico, sugiro fazer um comparativo. O teste que eu fiz foi bastante simplório, mas creio que é suficiente para mostrar que o uso de uma função *neste* caso estaria prejudicando a performance.
Veja o exemplo, realizado em um Linux RH com a versão 10g.
com o uso da função demorou 22 segundos para ler 1 milhão e sem, ou seja, somente com o TRUNC() - 6 segundos. Considerável diferença.

Código: Selecionar todos
ops$marcio@LNX10GR2> create table t as
  2  with x as
  3  (
  4   select trunc(sysdate)+ (level-1) dt
  5     from dual
  6    connect by 1=1 and level <= 1000000
  7  )
  8  select * from x
  9  /

Table created.

ops$marcio@LNX10GR2>
ops$marcio@LNX10GR2> select count(*) from t;

     COUNT(*)
-------------
      1000000

1 row selected.

ops$marcio@LNX10GR2>
ops$marcio@LNX10GR2> create or replace function f ( p_date in date )
  2  return date as
  3  begin
  4     return trunc(p_date);
  5  end;
  6  /

Function created.

ops$marcio@LNX10GR2> show error
No errors.
ops$marcio@LNX10GR2>
ops$marcio@LNX10GR2> set timing on
ops$marcio@LNX10GR2> set autotrace traceonly
ops$marcio@LNX10GR2>
ops$marcio@LNX10GR2> select f(dt) from t;

1000000 rows selected.

Elapsed: 00:00:22.21

Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873

----------------------------------
| Id  | Operation         | Name |
----------------------------------
|   0 | SELECT STATEMENT  |      |
|   1 |  TABLE ACCESS FULL| T    |
----------------------------------

Note
-----
   - rule based optimizer used (consider using cbo)


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
      11804  consistent gets
          0  physical reads
          0  redo size
   10300705  bytes sent via SQL*Net to client
     110374  bytes received via SQL*Net from client
      10001  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
    1000000  rows processed

ops$marcio@LNX10GR2> select trunc(dt) from t;

1000000 rows selected.

Elapsed: 00:00:06.81

Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873

----------------------------------
| Id  | Operation         | Name |
----------------------------------
|   0 | SELECT STATEMENT  |      |
|   1 |  TABLE ACCESS FULL| T    |
----------------------------------

Note
-----
   - rule based optimizer used (consider using cbo)


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
      11804  consistent gets
          0  physical reads
          0  redo size
   10300709  bytes sent via SQL*Net to client
     110374  bytes received via SQL*Net from client
      10001  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
    1000000  rows processed
mportes
Localização: São Paulo



  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


Voltar para PL/SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 16 visitantes

cron