Comparar as datas DB2

tenho um campo do tipo de data DB2 numa tabela DB2. Eu quero selecionar dados por um filtro de data. Por exemplo:

SELECT *
FROM   table
WHERE registrationdate > '2002-10-01';

a partir da consulta acima, obtenho registos com data de registo a partir de '1943-10-01' , mas isto está incorrecto.

Estes também não funcionam:

registrationdate > date('2002-10-01')
date(registrationdate) > date('2002-10-01')
date(registrationdate) > '2002-10-01'
Como preciso comparar datas?

 10
db2
Author: burnellj, 2012-05-28

4 answers

O formato padrão SQL para um literal de data é:

DATE '2002-10-01'
No mínimo, vale a pena tentar.
SELECT *
  FROM table
 WHERE registrationdate > DATE '2002-10-01';
 14
Author: Jonathan Leffler, 2012-05-28 17:17:05

Eu explorei alguns outros problemas com a base de dados, depois de reiniciar começou a funcionar, então isso funciona corretamente agora:

registrationdate > '2002-10-01'
 3
Author: yons88, 2012-05-29 11:06:34

O formato por omissão utilizado para as datas é determinado pelo código do território da base de dados DB2 (que pode ser especificado na hora de criação da base de dados). Por exemplo, meu banco de dados foi criado usando território=EUA. Portanto, o formato da data parece ser o seguinte:

values current date 
1 
---------- 
05/30/2003 

1 record(s) selected.

Pode obter o código do território do DB CFG.

db2 get db cfg | egrep 'code|territory'
 Database territory                                      = US
 Database code page                                      = 1208
 Database code set                                       = UTF-8
 Database country/region code                            = 1

Ou seja, o formato é MM/DD/AAAA. Se você quiser alterar o formato, você pode vincular a coleção de pacotes utilitários db2 para usar um formato de data diferente.

Para obter a data, hora e hora actuais usando o SQL, (basicamente dá-lhe uma ideia de qual é o formato da data), consulte os registos DB2 apropriados: O sysibm.a tabela sysdummy1 é uma tabela especial em memória que pode ser usada para descobrir o valor dos registos DB2

db2 "SELECT current date FROM sysibm.sysdummy1 "

1
----------
06/02/2014

  1 record(s) selected.

A função de data ainda funciona mesmo que deixemos de fora as aspas na função, mas o resultado não está correcto:

db2 "SELECT date(2001-09-22) FROM sysibm.sysdummy1 "

1
----------
05/24/0006

  1 record(s) selected.

Quando a função DATA recebe um carácter string as input, it assumes that it is valid character representation of a DB2 date, and converts it according. Em contraste, quando a entrada é numérica, a função assume que representa o número de dias menos um desde o início da era atual (ou seja, 0001-01-01). Na consulta acima a entrada foi de 2001-09-22, que é igual a (2001-9)-22, que é igual a 1970 dias.

E se todos OS acima são aplicáveis, o comando abaixo deve funcionar bem para o seu problema.

SELECT * FROM table WHERE registrationdate > '10/01/2002';

 3
Author: ultimatum, 2014-06-02 13:32:04

Usa este formato.

registrationdate > 'mm/dd/yyyy'
 0
Author: Dhanish Jose, 2014-01-03 07:27:15