Aprenda PL/SQL

Como funciona a mascara para data?

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Qui, 21 Fev 2013 3:08 pm

Caros senhores,
sei que é uma pergunta muito simples, mas durante os meus estudos venho percebendo
que mascaras são meu tendão de aquiles.
Se alguém tiver disponibilidade para me ensinar essas malditas mascaras, ficaria muito feliz.

Duvida:
Código: Selecionar todos
SELECT TO_DATE('10/10/2013 12:48:55','dd/mm/yyyy')


Se realizo este select, o resultado esperado deveria ser 10/10/2013 não deveria?

Já realizei a mudança do nls_date_format = 'dd/mm/yyyy hh24:mi:ss'

Grato pela ajuda senhores.
Rafael_Santos

Mensagemem Qui, 21 Fev 2013 11:05 pm

Rafael_Santos Tudo bem
primeiro da o seguinte comando : select sysdate from dual; e olha como esta o formato de sua data no banco , o oracle ira seguir o padrão do sysdate. Abaixo mais mascaras que você podera usar:

to_date('16-Feb-09', 'DD-Mon-YY')
to_date('02/16/09', 'MM/DD/YY')
to_date('021609', 'MMDDYY')
to_date('16-Feb-09', 'DD-Mon-YY HH:MI:SS')
to_date('Feb/16/09', 'Mon/DD/YY HH:MI:SS')
to_date('February.16.2009', 'Month.DD.YYYY HH:MI:SS')

para alterar definidamente no banco , você deve ir no parâmetro de inicialização do banco e abrir o inisid.ora e alterar ou adicionar a seguinte linha:
NLS_DATE_FORMAT='DD/MM/YY HH24:MI:SS'

Espero ter ajudado.
gleisoncandido

Mensagemem Sex, 22 Fev 2013 8:57 am

Oi Rafael,
Código: Selecionar todos
TO_DATE('10/10/2013 12:48:55','dd/mm/yyyy')

dá problema porque quando você vai CONVERTER STRING(CHAR) para DATE, você precisa informar EXATAMENTE uma máscara que ENCAIXA na string. No seu caso, como você informou data e hora na sua string, sua máscara de data deve conter HORAS também.
Código: Selecionar todos
TO_DATE('10/10/2013 12:48:55','dd/mm/yyyy hh24:mi:ss')

A "ÚNICA" máscara possível para esta conversão é esta.

Nestes casos STRING->TO_DATE precisa informar PRECISAMENTE a máscara.

Já quando você vai transformar DATE->TO_CHAR, não é necessário informar com esta precisão. o TO_CHAR torna-se apenas a maneira que você quer EXIBIR sua data em texto(ao contrario do TO_DATE que você precisa CONVERTER para data). Internamente DATE é tratado como se fosse um NUMBER. Portanto, não existem firulas de linguas, máscaras e etc.

Digamos que você tenha seu campo data(my_date) com a data "10/10/2013 12:48:55". você pode fazer N formas de TO_CHAR com ela, ou seja, você tem N forma de EXIBIR.
Código: Selecionar todos
TO_CHAR(my_date,'dd/mm/yyyy') = "10/10/2013"
TO_CHAR(my_date,'dd-mm-yy') = "10-10-13"
TO_CHAR(my_date,'RRRRMMDD') = "20131010"


Espero ter ajudado.
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Sex, 22 Fev 2013 4:00 pm

Olá Noctifero e gleisoncandido,
muito obrigado pela explicação foi excelente, as explicações se completaram.
Resumindo:
A mascara do to_date serve para o banco escolher como realizar a transformação do char para date.
A mascara do to_char serve para exibir uma informação.
O resultado do to_date sempre aparecerá conforme o padrão estabelecido pelo banco, se estabelecido pelo nls_date_format com hora aparecerá com hora até mesmo se a mascara compatível for sem horá o resultado aparecerá com hora 00:00:00.

Obrigado a todos, agora voltar aos estudos!

Abraços
Rafael_Santos

Mensagemem Sex, 22 Fev 2013 4:34 pm

Senhores só mais uma pergunta.
Como mostrar a data desta forma: 22/02/2013 04:32:33 pm

Realizei o seguinte procedimento:
Código: Selecionar todos
alter session set nls_date_format = 'dd/mm/yyyy hh:mi:ss am';
select sysdate from dual;


Obtive o seguinte resultado:

Código: Selecionar todos
22/02/2013 04:32:33 tarde


Alguém sabe o que esta faltando?
Rafael_Santos

Mensagemem Seg, 25 Fev 2013 9:11 am

O problema está com o idoma utilizado na sessão.

Você pode alterar o idioma com o to_char também:
Código: Selecionar todos
select to_char( sysdate, 'dd/mm/yyyy hh:mi:ss pm', 'nls_date_language=''brazilian portuguese''' ) from dual
union all
select to_char( sysdate, 'dd/mm/yyyy hh:mi:ss pm', 'nls_date_language=''english''' ) from dual
rogenaro
Localização: Londrina - PR

Rafael O. Genaro

Mensagemem Seg, 25 Fev 2013 3:35 pm

Obrigado rogenaro.

Abraços a todos.
Rafael_Santos

Mensagemem Seg, 22 Ago 2016 8:22 pm

Gostaria de agradecer a todos, eu tinha as mesmas duvidas, com a ajude de todos consegui resolver minhas duvidas.
Obrigado ...
:-o
Francois.Nogueira



Voltar para SQL

Quem está online

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