Domanda

Se ho bisogno per cercare Data di nascita che è memorizzato, senza le ore ei minuti, ma la data che ho per la ricerca con include ore e minuti Qual è il modo migliore per restituire tutte le righe in cui è abbinato data in solo giorno, mese e l'anno

vale a dire.
Memorizzati come 01-gen-50 10.22.06.000000000
Data selezionata 01-gen-50 10.22.06.010101120

Se uso la data con le ore ei minuti l'SQL restituisce solo le righe con il timestamp esatto e non quelle per solo il giorno, mese e anno.

Lo SQL ha bisogno di lavorare su Oracle, SQLServer, MySQL e DB2.

È stato utile?

Soluzione

di Oracle tipo DATE anteriore alla versione standard SQL (come fa di Informix), che rende questo estremamente difficile - se non impossibile - per fare in modo DBMS neutrale. Naturalmente, v'è una questione di "perché il prescelto rappresentazione dei dati include il tempo".

:

In SQL standard, la tecnica ovvia sarebbe quella di lanciare il TIMESTAMP a una data. Inoltre, non abbiamo una chiara spiegazione dei dati si deve cercare 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)

Ma questo presuppone che si scrive la 'data di cercare con' come un letterale. Se è una variabile host, quindi il tipo di variabile host dovrebbe essere DATA, non TIMESTAMP. E la colonna DateOfBirth dovrebbe probabilmente essere una data, non un TIMESTAMP. Non si deve usare TIMESTAMP a meno che la parte di tempo è rilevante -. Spreca stoccaggio e spreca tempo di calcolo

Si noti che a causa dei calchi, è improbabile che il DBMS sarà in grado di utilizzare tutti gli indici o niente. Se i tipi sono stati Sane, poi la query sarebbe semplicemente:

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

Altri suggerimenti

Come qualsiasi soluzione sta per richiedere la manipolazione di data e datetime oggetti, allora non vi sarà alcuna soluzione di sistema indipendente dal -. Ognuno avrà diverse funzioni per quegli oggetti

La soluzione migliore, diverso astrazione del database, sarebbe di arrotondare l'oggetto datetime utilizzato prima, allora solo una clausola confronto SQL generico è richiesto che sarà funzionale in tutti gli DB elencati.

Non c'è ANSI formato della data, né manipolazione di stringhe. Qualsiasi codice verrà eseguito solo in alcuni RDBMS di, se non uno solo.

Tuttavia, se stai ricevendo la data selezionata al di fuori RDBMS (ad esempio, PHP, Java, ecc), suggerirei sanitizzazione prima di inviarlo nella query; allora si può confrontare corda a corda, che dovrebbe funzionare in quasi tutti i sistemi.

Come altri hanno fatto notare, RDBMS di sono molto divergenti quando si tratta di gestire datetimes. Se che in realtà secondo lo standard ANSI-92, quindi il seguente dovrebbe funzionare:

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

Il non sarebbe il modo più efficace per farlo, però, dal momento che precluderebbe utilizzando gli indici alla data per la maggior parte dei sistemi. Il seguente potrebbe lavoro per un ANSI 92 banca dati pienamente conformi:

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)
:

Usa ESTRATTO ()

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top