Campo Date, no PLSQL sem Hora

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
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

aí pessoal,

alguém tem alguma ideia do porque quando pego alguma data com hora no plsql, sempre é tirado minha hora, quando atribuo a uma variavel do tipo date um valor com data e hora, a hora é tirada,

Selecionar tudo

SQL> set serveroutput on;
SQL> 
SQL> declare
  2    vchar varchar2(100);
  3    vdate date;
  4  begin
  5    select to_char(sysdate, 'dd/mm/rrrr hh24:mi:ss')
  6      into vchar
  7      from dual;
  8    dbms_output.put_line(vchar);
  9    vdate := to_date(vchar,'dd/mm/rrrr hh24:mi:ss');
 10    dbms_output.put_line(vdate);
 11  end;
 12  /
 
04/02/2010 14:06:28
04/02/2010
 
PL/SQL procedure successfully completed
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Selecionar tudo

SQL> show parameters nls;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_calendar                         string      
nls_comp                             string      
nls_currency                         string      
nls_date_format                      string      DD/MM/YYYY
nls_date_language                    string      
nls_dual_currency                    string      
nls_iso_currency                     string      
nls_language                         string      AMERICAN
nls_length_semantics                 string      BYTE
nls_nchar_conv_excp                  string      FALSE
nls_numeric_characters               string      
nls_sort                             string      
nls_territory                        string      AMERICA
nls_time_format                      string      
nls_time_tz_format                   string      
nls_timestamp_format                 string      
nls_timestamp_tz_format              string
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

tenta alterar o nls_date_format antes de executar a procedure...

Selecionar tudo

alter session set nls_date_format = 'dd/mm/yyyy hh24:mi:ss';
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

Complementando... a hora não é "tirada" ela só não é apenas apresentada por causa da formatação configurada para a data (NLS_DATE_FORMAT), mas a hora continua lá...
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Independentemente da configuração de NLS_DATE_FORMAT estar correta ou não, sempre use formato de conversão explícito. O PUT_LINE faz conversão implícita da sua data com um to_char() oculto, por isso acontece o que você observa na execução. Veja o exemplo abaixo:

Selecionar tudo

SQL> set serveroutput on
SQL> 
SQL> DECLARE
  2    vchar VARCHAR2(100);
  3    vdate DATE;
  4  BEGIN
  5    SELECT to_char(SYSDATE, 'dd/mm/rrrr hh24:mi:ss') INTO vchar FROM dual;
  6    dbms_output.put_line(vchar);
  7    vdate := to_date(vchar, 'dd/mm/rrrr hh24:mi:ss');
  8    dbms_output.put_line(to_char(vdate, 'dd/mm/rrrr hh24:mi:ss'));
  9    dbms_output.put_line(to_char(vdate));
 10  END;
 11  /
 
04/02/2010 14:47:30
04/02/2010 14:47:30
04/02/10
 
PL/SQL procedure successfully completed
 
SQL> select sys_context('USERENV', 'NLS_DATE_FORMAT') from dual;
 
SYS_CONTEXT('USERENV','NLS_DAT
--------------------------------------------------------------------------------
DD/MM/RR
 
SQL> 
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Realmente, o que acontecia era que eu estava debugando com o plsql, ai parava o mouse em cima, ele mostrava só a data, ai coloquei o dbms seco sem mascara, mostrava só a data, mas ela ta lá, forcando a mascara sai certo,

=]

realmente é independente do NLS_DATE_FORMAT, inclusive acho que nem aceita HH24:MI nesse parametro, ele é só pra data,

nesse caso também nem poderia, porque é uma function, e não procedure, ai não deixa também....

valeu aí pessoal
valentim
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Seg, 03 Mai 2010 5:26 pm
Localização: CE

Voçê pode utilizar a instrução DBMS_SESSION.SET_NLS disponível no PL/SQL:

Selecionar tudo

declare 
  -- Local variables here
  vData date;
begin
  -- Test statements here
  DBMS_SESSION.SET_NLS('nls_date_format','''DD/MM/RRRR hh24:MI:SS'''); 
  vData := sysdate;
  dbms_output.put_line(to_char(vData));
end;

RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Se o campo é date, ele sempre armazenará a hora. Muitos clients de oracle não trazem essa informação (hora) mesmo com a parametrizaçãod o banco de forma correta. alguns tem configuração propria (sql nav, pl/sql dev, etc).

porém, sempre que for fazer algo com data e você deseja obtger a hora, use o

Selecionar tudo

select to_date(to_char(sysdate,'dd/mm/yyyy hh24:mi:ss'),'dd/mm/yyyy hh24:mi:ss')
Você verá que a hora aparecerá (exceto se seu client tiver uma das configurações e a mesma sobrescrever qualquer atributo setado.)
Responder
  • Informação