Funções para tratamento de data/hora

Versão para impressãoEnviar para amigoVersão PDF

Existe inumeras funções para tratamento de data e hora no Informix. Muitas destas funções foram adicionadas na versão 11.
No Informix existe um tipo de campo chamado INTERVAL que é utilizado para trabalhar com quantidades em formato de data e hora. Para informações sobre o interval leia o artigo Como trabalhar com tipo de dado INTERVAL
Para calculos com datas, como referência, leia este artigo.

  1. Valor literal DATE / DATETIME
  2. Valor literal INTERVAL
  3. UNITS
  4. EXTEND
  5. DATE()
  6. TO_CHAR()
  7. TO_DATE()
  8. TODAY , CURRENT, SYSDATE
  9. DAY(),MONTH(),YEAR()
  10. MDY()
  11. ADD_MONTHS()
  12. MONTHS_BETWEEN()
  13. WEEKDAY()
  14. LAST_DAY()
  15. NEXT_DAY()
  16. DBINFO()
  17. Variaveis
    1. CLIENT_LOCALE
    2. GL_DATETIME
    3. GL_DATE
    4. DBCENTURY
    5. DBDATE
    6. DBTIME


Valor literal DATE / DATETIME


    A utilização de valores literais DATETIME e DATE é passada entre aspas, onde elas são convertidas automaticamente caso a expressão exija que o dado seja no formato DATETIME ou DATE.
    O tipo DATETIME no seu formato padrão é como um modo global de se trabalhar com data e hora, pois não importa o LOCALE utilizado, ele terá sempre o mesmo formato. O unico modo de alterar o formato padrão dele é utilizando a váriavel GL_DATETIME.
    Observação: Para alterar o formato do DATETIME em exportação/importação é necessário definir também a variavel USE_DTENV.

    Sempre se deve estar atento as váriaveis de ambiente que definem a formatação da data, pois elas tem efeito sobre a conversão de valores representados entre aspas (variaveis CLIENT_LOCALE, GL_DATETIME, GL_DATE, DBCENTURY, DBDATE, DBTIME).
    # Neste exemplo o meu CLIENT_LOCALE esta definido para pt_BR.8859-1
    # por isso que ele aceita e exibe a data no formato dia/mes/ano.
    $ dbaccess sysmaster -
    Database selected.
    > create temp table tp01 ( dt1 date , dt2 DATETIME year to second);
    Temporary table created.
    > insert into tp01 values ('18/07/2009', '2009-07-18 23:50:34');
    1 row(s) inserted.
    > select * from tp01;
    dt1      dt2
    18/07/09 2009-07-18 23:50:34
    
    # Se executado o mesmo código com o CLIENT_LOCALE definido
    # para en_US.8859-1 ocorre o erro abaixo:
    >  insert into tp01 values ('18/07/2009', '2009-07-18 23:50:34');
     1205: Invalid month in date
    Error in line 1
    Near character position 61
    > insert into tp01 values ('07/18/2009' , '2009-07-18 23:50:34');
    1 row(s) inserted.
    > select * from tp01;
    dt1        dt2
    07/18/2009 2009-07-18 23:50:34
    


    Outro modo de representação literal para tipo DATETIME é com a utilização da função DATETIME().
    Porém quando utilizada, a informação tem que ser passada obrigatóriamente sem aspas.
    > select datetime( 18 15:20) day to minute from sysmaster:sysdual;
    (constant)
    18 15:20
    # Utilizando aspas não é válido
    > select datetime( "18 15:20" ) day to minute from sysmaster:sysdual;
     1262: Non-numeric character in datetime or interval.
    Error in line 1
    Near character position 45
    


Valor literal INTERVAL


    Valores literais para tipo INTERVAL precisam ser especificados através da função INTERVAL().
    Igual a função DATETIME, não é possível utilizar uma string com a função INTERVAL(). Para uma representação em formato string é necessário utilizar as funções de conversão CAST,:: manualmente.
    > create temp table tp01 ( dt1 date , dt2 DATETIME year to second);
    Temporary table created.
    > insert into tp01 values (current, current);
    1 row(s) inserted.
    
    # Utilizando a função
    > select dt2, dt2 + interval(05 2) day to hour from tp01;
    dt2                 (expression)
    2009-07-18 15:11:05 2009-07-23 17:11:05
    
    # Utilizando CAST
    > select dt2 , dt2 + "05 10"::interval day to hour from tp01;
    dt2                 (expression)
    2009-07-18 15:11:05 2009-07-24 01:11:05
    
    


    Para informações de como utilizar INTERVAL leia o artigo Como trabalhar com INTERVAL

UNITS


    O objetivo desta função é utilizar valores inteiros em calculos com datas.
    A função UNITS é na realidade um operador de conversão, onde converte um valor inteiro para um valor na unidade do tipo INTERVAL
    ATENÇÃO: Existe um problema na utilização do operador UNITS que passa desapercebido por muita gente. Quando a soma é realizada em unidade de mês e o resultado final seria uma data inexistente, ele irá retornar o erro "1267: The result of a datetime computation is out of range.". Para contornar o problema deve-se utilizar a função ADD_MONTHS.
    > select dt1, dt1 + 1 units day as dt1_1dia, 
     dt2, dt2 + 1 units minute as dt2_1min from tp01;
    dt1        18/07/2009 
    dt1_1dia   2009-07-19 
    dt2        2009-07-18 16:07:27 
    dt2_1min   2009-07-18 16:08:27
    

    Repare que a formatação do campo dt1_1dia está diferente do campo dt1. Isso se deve a soma realizada, para mais informações consulte este artigo.

EXTEND


    A função EXTEND altera a precisão de um campo DATETIME, onde pode converter um DATE para DATETIME e/ou alterar a precisão de um DATETIME.
    > create temp table tp01 ( dt1 date , dt2 DATETIME year to second);
    Temporary table created.
    > insert into tp01 values (current, current);
    1 row(s) inserted.
    > select extend(dt1, month to minute) as dt 
    , extend (dt2, year to day) as dt2 from tp01;
    dt   07-18 00:00 
    dt2  2009-07-18
    


DATE()


    A função DATE() converte uma string, DATETIME ou INTEGER para um valor do tipo DATE.
    # Observe que a coluna b não converteu corretamente, isso acontece porque o 
    # Informix entende que a data 15/10/2009 é na realidade duas divisões, 
    # 15 divido por 10 divido por 2009. 
    # Quando passado um valor inteiro o Informix interpreta como dias a partir 
    # data de 31 de Dezembro de 1899
    > select date("15/10/2009") as a 
    , date(15/10/2009) as b 
    , date(dt2) as c
    , date(0) as d
    , date(100) as e from tp01;
    a  15/10/2009           
    b  31/12/1899           
    c  18/07/2009           
    d  31/12/1899           
    e  10/04/1900
    


TO_CHAR()


    A função TO_CHAR gera, a partir de uma data/hora, uma string formatada conforme definição do usuário.
    Na realidade esta função funciona com tipos DATA e NUMERICO, onde ele poderá gerar formatos de saida relacionada ao tipo de dado informado.
    Para formatação de campos DATE/DATETIME ele trabalha com as mesmas mascaras utilizada pelas váriaveis GL_DATE e GL_DATETIME.
    Observação: As formatações de data sempre tem efeito do LOCALE utilizado, portanto se for utilizado o LOCALE pt_BR, os nomes dos meses e dias da semana serão apresentados em português.
    # Sintaxe:
    TO_CHAR( [data], [formato])
    # Exemplo
    > select dt1, dt2, TO_CHAR(dt1 , "%A. %e de %B, %Y") as a
    , TO_CHAR(dt2, "Gerado as %H horas e %M minutos") as b from tp01;
    dt1  18/07/2009
    dt2  2009-07-18 16:26:28
    a    Sábado. 18 de Julho, 2009
    b    Gerado as 16 horas e 26 minutos
    
    # CLIENT_LOCALE=pt_BR.8859-1
    > select dt1, dt2, TO_CHAR(dt1 , "%A. %e de %B, %Y") as a
    , TO_CHAR(dt2, "dia da semana: %A - mes %B") as b from tp01;
    dt1  18/07/09
    dt2  2009-07-18 00:00:00
    a    Sábado. 18 de Julho, 2009
    b    dia da semana: Sábado - mes Julho
    
    # CLIENT_LOCALE=en_US.8859-1
    > select dt1, dt2, TO_CHAR(dt1 , "%A. %e de %B, %Y") as a
    , TO_CHAR(dt2, "dia da semana: %A - mes %B") as b from tp01;
    dt1  07/18/2009
    dt2  2009-07-18 00:00:00
    a    Saturday. 18 de July, 2009
    b    dia da semana: Saturday - mes July
    
    # A função pode ser utilizada sem o segundo parametro, onde ela irá converter
    # a data para texto utilizando as configurações de LOCALE/variaveis definidas
    # CLIENT_LOCALE=pt_BR.8859-1
    select current, to_char(current) from sysmaster:sysdual
    (expression)  2009-11-27 09:22:33.000
    (expression)  Sex 27 Nov 2009, 09:22:33
    
    # GL_DATETIME="%d/%m/%Y %T"
    select current, to_char(current) from sysmaster:sysdual
    (expression)  27/11/2009 09:23:41
    (expression)  27/11/2009 09:23:41
    
    # CLIENT_LOCALE=en_US.8859-1
    select current, to_char(current) from sysmaster:sysdual
    (expression)  2009-11-27 09:24:22.000
    (expression)  2009-11-27 09:24:22
    

    Para uma lista dos códigos utilizados nas mascaras, clique no link das variáveis GL_* descritas anteriormente.

TO_DATE()


    A função TO_DATE converte uma string em uma data, conforme a formtação passada pelo usuário.
    Ela utiliza as mesmas mascaras de formatação utilizada pela função TO_CHAR , que são as mascaras da váriavel GL_DATE e GL_DATETIME.
    Observação: As formatações de data sempre tem efeito do LOCALE utilizado, portanto se for utilizado o LOCALE pt_BR, os nomes dos meses e dias da semana serão apresentados em português.
    > create temp table tp01 ( dt1 date , dt2 DATETIME year to second);
    Temporary table created.
    > insert into tp01(dt1) values (
      to_date("Escrito em 23 de fevereiro de 2009 as 9:43"
            , "Escrito em %e de %B de %Y as %H:%M"));
    1 row(s) inserted.
    > select * from tp01;
    dt1        dt2
    23/02/2009
    

    Para uma lista dos códigos utilizados nas mascaras, clique no link das variáveis GL_* descritas anteriormente.

TODAY , CURRENT, SYSDATE


    TODAY
    A função TODAY retorna apenas a data corrente do sistema no tipo de dado DATE.

    CURRENT [ limite_superior TO limite_inferior]
    A função CURRENT retorna a data e hora do sistema onde retorna até 3 digitos da fração de segundos.
    Pode-se especificar qual nível do conteúdo será retornado (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, FRAC)
    Quando o parâmetro USEOSTIME no ONCONFIG é desabilitado (=0) o Informix irá retornar 0 na fração de segundos, se habilitado o Informix irá buscar no sistema operacional a hora exata em frações de segundos.
    Antigamente se recomendava deixar o parametro USEOSTIME desabilitado pois as funções de S.O. para retornar este valor normalmente degradava a performance do banco. Porém atualmente elas já são muito mais eficazes e não tem uma degradação tão grande.

    SYSDATE [ limite_superior TO limite_inferior]
    A sintaxe é a mesma do CURRENT e seu funcionamento é o mesmo, a unica diferença é que ela trabalha com a fração de segundos em 5 casas decimais.
    > select today from sysmaster:sysdual; 
    (expression) 
    07/18/2009
    
    > select current year to month as a , current as b 
    from sysmaster:sysdual;
    a 2009-07 
    b 2009-07-18 11:21:29.000
    
    > select sysdate hour to minute as a ,sysdate as b 
    from sysmaster:sysdual;
    a 12:49 
    b 2009-07-18 12:49:20.93673
    
    # Aqui o parâmetro USEOSTIME foi ativado 
    > select sysdate as sys current as curr from sysmaster:sysdual;
    sys  2009-07-18 12:45:48.23243 
    curr 2009-07-18 12:45:48.232
    


DAY(),MONTH(),YEAR()


    Estas três funções: DAY(), MONTH(), YEAR() operam da mesma maneira, porém trabalhando cada um com um dado diferente. As três extraem de um campo DATE/DATETIME o dia, mês e ano e retornam como um valor inteiro.
    > select dt1, day(dt1) as dia
    , month(dt1) as mes
    , year(dt1) as ano from tp01;
    dt1           dia    mes    ano
    23/02/2009     23      2   2009
    


MDY()


    A função MDY() faz o inverso das três funções acima, ele pega valores inteiros de dia,mês e ano e converte em um campo do tipo DATE.
    ATENÇÃO: Observe pelo próprio nome da função que o padrão da ordem dos campos é primeiro o mês.
    > select mdy(2,23,2009) as data from sysdual;
    data
    23/02/2009
    


ADD_MONTHS()


    A função ADD_MONTHS() tem por finalidade somar meses em campos DATE/DATETIME calculando corretamente quando o valor final for uma data inexistente.
    Quando isso ocorrer ele irá seguir uma regra simples, se o resultado final for um dia em que não existe no mês resultante, será retornado o ultimo dia deste mês. Para melhor ilustração veja o exemplo abaixo.
    > create temp table tp01 ( dt1 date , dt2 DATETIME year to second);
    Temporary table created.
    >  insert into tp01(dt1) values ("01/01/2009");
    1 row(s) inserted.
    > insert into tp01(dt1) values ("31/01/2009");
    1 row(s) inserted.
    
    # Aqui com a função UNITS ocorre erro ao somar um mês
    # onde o resultado irá retornar uma data inexistente, já que não existe
    # o dia 31 de fevereiro.
    > select (dt1 + 1 units month)::date
    , add_months(dt1, 1)::date , dt1 from tp01;
    (expression) (expression) dt1
    01/02/09     01/02/09     01/01/09
     1267: The result of a datetime computation is out of range.
    Error in line 1
    Near character position 75
    
    > select add_months(dt1, 1)::date , dt1 from tp01;
    (expression) dt1
    01/02/09     01/01/09
    28/02/09     31/01/09
    


MONTHS_BETWEEN()


    A função MONTHS_BETWEEN retorna em valor decimal a quantidade de meses entre duas datas onde a parte fracionária representa os dias, horas e minutos.
    > select today as ai
    , months_between(today, date('19/03/2005')) as b
    , months_between(today, date('20/03/2005')) as c  from sysdual;
    a 19/07/09 
    b 52,0000000000000 
    c 51,9677419354839
    


WEEKDAY()


    A função WEEKDAY() retorna um valor numérico entre 0 e 6 que representa o dia da semana onde:
      0 = Domingo
      1 = Segunda-Feira
      2 = Terça-Feira
      3 = Quarta-Feira
      4 = Quinta-Feira
      5 = Sexta-Feira
      6 = Sabado
    > select weekday(today) as a , weekday(date('01/01/2009')) as b from sysdual;
         a      b
         0      4
    


LAST_DAY()


    A função LAST_DAY() retorna a data do ultimo dia do mês da data passada como parâmetro.
    > select today as a 
    , last_day(today) as b
    , last_day(today) - today as c from sysdual;
    a 19/07/09 
    b 31/07/09          
    c 12
    


NEXT_DAY()


    A função NEXT_DAY() retorna uma data, onde esta data representa o próximo dia da semana passado como parâmetro.
    O dia da semana passado é a abreviação das 3 primeiras letras em ingles e não alteram com o LOCALE:
      SUN = Domingo
      MON = Segunda-Feira
      TUE = Terça-Feira
      WED = Quarta-Feira
      THU = Quinta-Feira
      FRI = Sexta-Feira
      SAT = Sabado
    > create temp table tp01 ( dt1 date , dt2 DATETIME year to second);
    Temporary table created.
    > insert into tp01(dt1) values (today+3);
    1 row(s) inserted.
    > insert into tp01(dt1) values (today-10);
    1 row(s) inserted.
    > insert into tp01(dt1) values (today-2); 
    1 row(s) inserted.
    > insert into tp01(dt1) values (today);
    1 row(s) inserted.
    > select dt1, next_day(dt1, 'sat') as sat
    , next_day(dt1, 'wed') as wed from tp01;
    dt1      sat      wed
    22/07/09 25/07/09 29/07/09
    09/07/09 11/07/09 15/07/09
    17/07/09 18/07/09 22/07/09
    19/07/09 25/07/09 22/07/09
    
    # Para facilitar o entendimento, abaixo segue o calendário do mês
    # para que possa associar as datas com os dias da semana passado como
    # parâmetro na função next_day()
    $ cal
          July 2009
    Su Mo Tu We Th Fr Sa
              1  2  3  4
     5  6  7  8  9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30 31
    
    


DBINFO()


    Na função DBINFO() possui três parâmetros relacionados a data/hora.
    Para maiores informações sobre a utilização destas funções, consulte o manual.
    • 'get_tz'
      Retorna o valor da variável de ambiente $TZ utilizado na sessão.
    • 'utc_current'
      Retorna a hora corrente valor inteiro , representando em segundos a partir de 1970-01-01 00:00:00+00:00
    • 'utc_to_datetime'
      Converte um valor de data UTC em DATETIME. Muito util com as tabelas de sistema do Informix (sys*).

Variaveis



    CLIENT_LOCALE


    Define todas as formatações de representação de datas, valores, moedas e acentuações.

    GL_DATETIME


    Variável utilizada para definir a mascara de conversão de uma string para o tipo DATETIME ou inverso.
    É a variável que tem menor preferência entre as DBDATE+DBTIME e CLIENT_LOCALE.
    Copiado do manual, seus parametros básicos seguem abaixo, porém há muitos mais parametros e modos de personalização, similar a um comando printf.
      %H Is replaced by the hour as an integer (00 through 23) (24-hour clock).
      %I Is replaced by the hour as an integer (00 through 12) (12-hour clock).
      %M Is replaced by the minute as an integer (00 through 59).
      %p Is replaced by the A.M. or P.M. equivalent as defined in the locale.
      %r Is replaced by the commonly used time representation for a 12-hour clock format (including the A.M. or P.M. equivalent) as defined in the locale.
      %R Is replaced by the time in 24-hour notation (%H:%M).
      %S Is replaced by the second as an integer (00 through 61). The second can be up to 61 instead of 59 to allow for the occasional leap second and double leap second.
      %T Is replaced by the time in the %H:%M:%S format.
      %X Is replaced by the commonly used time representation as defined in the locale.
      %% Is replaced by % (to allow % in the format string).
      

    GL_DATE


    Variável utilizada para definir a mascara de conversão de uma string para o tipo DATE ou inverso.
    É a variável que tem menor preferência entre as DBDATE e CLIENT_LOCALE.
    Copiado do manual, seus parametros básicos seguem abaixo, porém há muitos mais parametros e modos de personalização, similar a um comando printf.
      %a Is replaced by the abbreviated weekday name as defined in the locale.
      %A Is replaced by the full weekday name as defined in the locale.
      %b Is replaced by the abbreviated month name as defined in the locale.
      %B Is replaced by the full month name as defined in the locale.
      %C Is replaced by the century number (the year divided by 100 and truncated to an integer) as an integer (00 through 99).
      %d Is replaced by the day of the month as an integer (01 through 31). A single digit is preceded by a zero (0).
      %D Is the same as the %m/%d/%y format.
      %e Is replaced by the day of the month as a number (1 through 31). A single digit is preceded by a space.
      %h Is the same as the %b formatting directive.
      %iy Is replaced by the year as a 2-digit number (00 through 99) for both reading and printing. It is the Informix-specific formatting directive for %y.
      %iY Is replaced by the year as a 4-digit number (0000 through 9999) for both reading and printing. It is the Informix-specific formatting directive for %Y.
      %m Is replaced by the month as a number (01 through 12).
      %n Is replaced by a newline character.
      %t Is replaced by the TAB character.
      %w Is replaced by the weekday as a number (0 through 6); 0 represents the locale equivalent of Sunday.
      %x Is replaced by a special date representation that the locale defines.
      %y Requires that the year be a 2-digit number (00 through 99) for both reading and printing.
      %Y Requires that the year be a 4-digit number (0000 through 9999) for both reading and printing.
      %% Is replaced by % (to allow % in the format string).
      

    DBCENTURY


    Define como será trata a conversão do século quando houver dois digitos no ano.
    Por exemplo se informado "25/10/93" se será convertido para "25/10/1993" ou "25/10/2093"
      R - Current : Utiliza os mesmo dois primeiros digitos do ano corrente.
      P - Past    : Utiliza os dois primeiros digitos da data mais antiga com 
                    relação a data atual.
      F - Future  : Faz o inverso da opção P , utiliza o digito da data futura 
                    mais próxima.
      C - Closest : Utiliza o valor é mais próximo da data atual e utiliza.
      

    DBDATE


    Tem a mesma finalidade que as variáveis GL_DATE e GL_DATETIME, porém ela descende de versões mais antigas do Informix e é mantida apenas por questão de compatibilidade.
    Portanto, não é recomendado o seu uso!
    Ela tem maior predencia que a GL_DATE,GL_DATETME e CLIENT_LOCALE.
    Os valores para utilização são:
      D   - dia 
      M   - Mes 
      Y2  - Ano com 2 digitos
      Y4  - Ano com 4 digitos
      /., - Separadores
      0   - Sem separadores
      
      Exemplos copiado do manual:
      DBDATE Setting 	Representation of January 8, 2005: 	  	
      MDY4/ 	01/08/2005 	  	Y2DM. 	05.08.01
      DMY2- 	08-01-05 	  	MDY20 	010805
      MDY4 	01/08/2005 	  	Y4MD* 	2005/01/08
      

    DBTIME


    Tem a mesma finalidade que a variável GL_DATETIME, porém ela tem efeito apenas sobre certas funções da biblioteca ESQL/C e é mantida apenas por questão de compatibilidade.
    Portanto, não é recomendado o seu uso!
    Ela tem maior predencia que a GL_DATETME e CLIENT_LOCALE.
    Utiliza os mesmos códigos de formatação do GL_DATETIME/GL_DATE , permitindo a formatação igual ao printf

4.75
Média: 4.8 (8 votos)
Sua avaliação: Nenhum

Comentar

O conteúdo deste campo é privado não será exibido ao público.
  • Endereços de páginas de internet e emails viram links automaticamente.
  • Você pode usar tags BBCode no texto.
  • Tags HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>

Mais informações sobre as opções de formatação

CAPTCHA
Este teste é para bloquear programas automatizados e previnir spams
CAPTCHA de Imagem
Digite o texto exibido na imagem.