Agnóstico base de datos SQL para la lista para regresar Fecha de nacimiento almacenada como una marca de tiempo

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

Pregunta

Si tengo que buscar en la fecha de nacimiento que se almacena sin las horas y los minutos, pero la fecha que tengo que buscar con incluye horas y minutos Cuál es la mejor manera de devolver todas las filas en las que la fecha está emparejado en el único día, mes y el año

es decir.
Almacenado como 01-ENE-50 10.22.06.000000000
fecha seleccionada 01-ENE-50 10.22.06.010101120

Si utilizo la fecha con las horas y los minutos del SQL sólo devolverá filas con la fecha y hora exacta, y no los de sólo el día, mes y año.

El SQL tiene que trabajar en Oracle, SQL Server, MySQL y DB2.

¿Fue útil?

Solución

de Oracle tipo DATE es anterior a la versión estándar SQL (como lo hace de Informix), lo que hace que este muy difícil - si no imposible - a hacer de una manera neutral DBMS. Por supuesto, no es una cuestión de "¿por qué la representación de datos elegido incluye el tiempo".

En SQL estándar, la técnica obvia sería la de emitir el TIMESTAMP a una fecha. También no tenemos una explicación clara de los datos que hay que buscar con.

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)

Pero eso supone que escriba la fecha de caducidad a buscar con 'como un literal. Si se trata de una variable del sistema principal, entonces el tipo de la variable del sistema principal debe ser la fecha no se marca de tiempo. Y la columna de DateOfBirth probablemente debería ser una fecha, no es una marca de tiempo. Usted no debe usar TIMESTAMP menos que la pieza del tiempo es relevante -. Desperdicia almacenamiento y desperdicia tiempo de cálculo

Tenga en cuenta que debido a los moldes, es poco probable que el DBMS será capaz de utilizar cualquier índice o nada. Si se cuerdos los tipos, la consulta sería simplemente:

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

Otros consejos

Como cualquier solución va a requerir la manipulación de la fecha y de fecha y hora objetos, entonces no habrá una solución de sistema agnóstico -. Cada uno tendrá diferentes funciones para aquellos objetos

La mejor solución, aparte de abstracción de base de datos, sería para redondear el objeto de fecha y hora se utiliza primero, entonces sólo una cláusula de comparación SQL genérico se requiere que será funcional en todos los DBs enumerados.

No hay un formato ANSI fecha, ni la manipulación de cadenas. Cualquier código se ejecutará sólo en ciertas de RDBMS, si no sólo uno.

Sin embargo, si usted está recibiendo su fecha seleccionada fuera de su RDBMS (por ejemplo, PHP, Java, etc.), me gustaría sugerir desinfección antes de enviarlo en la consulta; entonces se puede comparar cadena a cadena, que debería funcionar en casi todos los sistemas.

Como otros han señalado, de RDBMS son muy divergentes cuando se trata de manejar datetimes. Si que en realidad siguen el estándar ANSI-92, a continuación, el siguiente debe funcionar:

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

El No sería la manera más eficiente de hacerlo, sin embargo, ya que impediría la utilización de índices en la fecha para la mayoría de los sistemas. La siguiente podría trabajo para una base de datos totalmente compatible con ANSI-92:

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)

Uso EXTRACT ()

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top