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
Responder
Avatar do usuário
tfg
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 83
Registrado em: Seg, 03 Mai 2004 3:38 pm
Localização: Novo Hamburgo - RS

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:

Selecionar tudo

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!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

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

Pode usar o TRUNC pra isso!!!

Veja o exemplo simples:

Selecionar tudo

SQL> select trunc(sysdate, 'mm') DATA from dual;

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

Também pode pegar o primeiro dia do ANO!

Selecionar tudo

SQL> select trunc(sysdate, 'rr') DATA from dual;

DATA
---------
01-JAN-04
Avatar do usuário
leobbg
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 22
Registrado em: Sex, 29 Out 2004 10:25 am
Localização: PORTO ALEGRE - RS
Leo BBG Consultor Oracle

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.
Avatar do usuário
tfg
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 83
Registrado em: Seg, 03 Mai 2004 3:38 pm
Localização: Novo Hamburgo - RS

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)
Avatar do usuário
leobbg
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 22
Registrado em: Sex, 29 Out 2004 10:25 am
Localização: PORTO ALEGRE - RS
Leo BBG Consultor Oracle

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.
schnu
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 110
Registrado em: Ter, 24 Mai 2005 9:16 pm
Localização: Dongguan - Guangdong - China

Selecionar tudo

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
Avatar do usuário
anderson
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 06 Jun 2005 1:08 pm
Localização: Toledo - PR
Contato:
Anderson Nuernberg
---

assim também funciona...

Selecionar tudo

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
mportes
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Ter, 01 Nov 2005 11:53 pm
Localização: São Paulo
Contato:

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.

Selecionar tudo

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
Responder
  • Informação
  • Quem está online

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