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
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 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:

Selecionar tudo

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.
gleisoncandido
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Dom, 20 Mai 2012 2:29 pm
Contato:

Rafael_Santos Tudo bem
primeiro da o seguinte comando :

Selecionar tudo

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:

Selecionar tudo

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')
Veja aqui o formato das datas: http://glufke.net/oracle/viewtopic.php?f=2&t=22

Selecionar tudo

AM   - AM ou PM   
CC   - Século 
D    - Dia da semana (1-7)
DAY  - Dia da semana ('SUNDAY') 
DD   - Dia do mês (1-31)
DDD  - Dia do ano
DY   - Dia da semana abreviado ('SUN')
FM   - Tira os blanks ou Zeros da esquerda
HH   - Hora do dia (0-12)
HH24 - Hora do dia (0-24)
MI   - Minutos da Hora
MM   - Mês com 2 dígitos
MON  - Mês abreviado ('NOV')
MONTH- Mês por extenso ('NOVEMBER')
PM   - AM ou PM
RR   - Ano com 2 dígitos - especial
RRRR - Ano com 4 dígitos
SS   - Segundos do minuto(0 - 59)
SSSSS- Segundos do dia
W    - Semana do Mês
WW   - Semana do Ano
YEAR - Ano por extenso
YY   - Ano com 2 dígitos
YYYY - Ano com 4 dígitos
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.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Oi Rafael,

Selecionar tudo

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.

Selecionar tudo

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.

Selecionar tudo

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.
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 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
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 pm

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

Realizei o seguinte procedimento:

Selecionar tudo

alter session set nls_date_format = 'dd/mm/yyyy hh:mi:ss am';
select sysdate from dual;
Obtive o seguinte resultado:

Selecionar tudo

22/02/2013 04:32:33 tarde
Alguém sabe o que esta faltando?
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

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

Você pode alterar o idioma com o to_char também:

Selecionar tudo

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
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 pm

Obrigado rogenaro.

Abraços a todos.
Francois.Nogueira
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Seg, 22 Ago 2016 8:18 pm

Gostaria de agradecer a todos, eu tinha as mesmas duvidas, com a ajude de todos consegui resolver minhas duvidas.
Obrigado ...
:-o
Responder
  • Informação
  • Quem está online

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