Banco de dados SQL agnóstico para a lista de retornar para Data de nascimento armazenado como um Timestamp

StackOverflow https://stackoverflow.com/questions/868464

Pergunta

Se eu precisar pesquisar na Data de nascimento que é armazenado sem as horas e minutos, mas a data Eu tenho que procurar com inclui horas e minutos que é a melhor maneira de retornar todas as linhas em que data é correspondidas em único dia, mês e ano

i.
Armazenado como 01-JAN-50 10.22.06.000000000
data selecionada 01-JAN-50 10.22.06.010101120

Se eu usar a data com as horas e minutos do SQL só irá retornar as linhas com a data e hora exata e não aqueles para apenas o dia, mês e ano.

As necessidades de SQL para trabalhar em Oracle, SQLServer, MySQL e DB2.

Foi útil?

Solução

tipo DATE pré-datas da Oracle A versão padrão SQL (como faz Informix do), o que torna esta extremamente difícil - se não impossível - para fazer de uma forma SGBD neutro. Claro, há uma questão de "por que a representação de dados escolhido incluir o tempo".

No SQL padrão, a técnica óbvia seria a de lançar o TIMESTAMP para uma data. Nós também não têm uma explicação clara dos dados que você tem que procurar com.

SELECT CAST(DateOfBirth AS DATE), ...other columns...
    FROM TheMysteryTable         -- Why do people hate giving tables names?
    WHERE CAST(DateOfBirth AS DATE) =
          CAST(TIMESTAMP '1950-01-01 10.22.06.010101120' AS DATE)

Mas isso pressupõe que você escreve a 'data de pesquisa com' como um literal. Se é uma variável do host, em seguida, o tipo da variável do host deve ser DATE, não TIMESTAMP. Ea coluna DateOfBirth provavelmente deve ser uma data, não um TIMESTAMP. Você não deve usar TIMESTAMP menos que a parte da hora é relevante -. Desperdiça armazenamento e desperdiça tempo de computação

Note que por causa dos moldes, é improvável que os DBMS será capaz de usar todos os índices ou qualquer coisa. Se os tipos foram sane, em seguida, a consulta seria simplesmente:

SELECT DateOfBirth, ...other columns...
    FROM TheMysteryTable
    WHERE DateOfBirth = DATE '1950-01-01'

Outras dicas

Como qualquer solução vai exigir manipulação de data e datetime objetos, então não haverá solução agnóstica-system -. Cada um terá diferentes funções para esses objetos

A melhor solução, que não seja de abstração de banco de dados, seria arredondar o objeto de data e hora a ser utilizado pela primeira vez, em seguida, é necessária apenas uma cláusula de comparação SQL genérico que será funcional em todos os bancos de dados listados.

Não há formato de data ANSI, nem a manipulação de cadeia. Qualquer código será executado apenas em certa RDBMS de, se não apenas um.

No entanto, se você está recebendo sua data selecionada fora do seu RDBMS (digamos, PHP, Java, etc.), eu sugiro saneantes-lo antes de enviá-lo na consulta; em seguida, você pode comparar corda para corda, que deve funcionar em quase todos os sistemas.

Como outros apontaram, RDBMS são muito divergentes quando se trata de manipulação datetimes. Se que realmente seguiu o padrão ANSI-92, em seguida, o seguinte deve funcionar:

SELECT
     <column list>
FROM
     <table name>
WHERE
     CAST(birth_date AS DATE) = CAST(search_date AS DATE)

O não seria a maneira mais eficiente de fazer isso, porém, uma vez que impediria o uso de índices na data para a maioria dos sistemas. O seguinte pode trabalho para um banco de dados totalmente ANSI-92 compatível com:

SELECT
     <column list>
FROM
     <table name>
WHERE
     birth_date >= CAST(CAST(search_date AS DATE) AS DATETIME) AND
     birth_date < CAST(CAST(search_date AS DATE) + 1 AS DATETIME)

Use EXTRACT ()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top