Nella seguente domanda, i nomi dei campi e delle tabelle sono stati modificati per proteggere le loro identità.
Se ho due colonne del database:
MONKEY_DATE DATETIME NULL (with data e.g. 2012-05-14 00:00:00.000)
MONKEY_TIME DATETIME NULL (with data e.g. 1753-01-01 16:30:53.025)
Il componente data del campo orario è per lo più impostato al 1 ° gennaio 1753 ... ma alcuni dati sono il 1 ° gennaio 1899 e alcuni hanno il 1 ° gennaio 1900.
Trovo che mantenere il codice per interrogare e riportare su queste colonne possa causare a me (e al nostro team) un mal di testa che potrebbe facilmente essere risolto unendo le due colonne. Tuttavia, l'esperienza (e Terry Goodkind ) mi ha insegnato che niente è mai facile. Vedi sotto alcuni esempi del perché questo è un mal di testa.
Il mio approccio
Penso che il seguente approccio avrà l'effetto desiderato di unire le due colonne:
- Utilizzare SQL per aggiornare i dati, impostando il valore per il campo data e il valore per il campo orario entrambi sullo stesso valore, che è un mix del componente data dal campo data e il componente orario dal campo ora
- Scrivi qualsiasi nuovo codice solo utilizzando il campo MONKEY_DATE
- Eventualmente eliminare gradualmente il campo MONKEY_TIME e qualsiasi componente SQL di data / ora (vedi esempi)
- Elimina MONKEY_TIME
Questo significa che non dobbiamo immediatamente apportare modifiche retrospettive all'intero sistema ... tutto il codice esistente continuerà a funzionare ... e possiamo iniziare a fare le cose nel modo giusto.
SQL per # 1 potrebbe essere (Oracle):
UPDATE MONKEY SET
MONKEY_DATE = TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY ') ||
TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'),
'MM/DD/YYYY HH24:MI:SS')
MONKEY_TIME = TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY ') ||
TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'),
'MM/DD/YYYY HH24:MI:SS')
La domanda
Le mie domande sono:
- Questi campi dovrebbero essere uniti?
- Il mio approccio è ragionevole per unire queste due colonne?
- Pensi che sarebbe meglio saltare i passaggi due e tre?
- Hai altri commenti o suggerimenti (costruttivi)?
Esempi
Ad esempio, per selezionare tutte le date e le ore della mia scimmia e ordinarle per data e ora, ho bisogno di fare qualcosa del genere (SQL Server):
SELECT
CONVERT(DATETIME, CONVERT(VARCHAR, MONKEY_DATE, 101), 101) AS MONKEY_DATE
, CONVERT(DATETIME, CONVERT(VARCHAR, MONKEY_TIME, 108), 108) AS MONKEY_TIME
FROM MONKEY
ORDER BY
CONVERT(DATETIME, CONVERT(VARCHAR, MONKEY_DATE, 101), 101) DESC
, CONVERT(DATETIME, CONVERT(VARCHAR, MONKEY_TIME, 108), 108) DESC
o questo (Oracle - leggermente più esplicito):
SELECT
TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY'), 'MM/DD/YYYY') AS MONKEY_DATE
, TO_DATE(TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'), 'HH24:MI:SS') AS MONKEY_TIME
FROM MONKEY
ORDER BY
TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY'), 'MM/DD/YYYY') DESC
, TO_DATE(TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'), 'HH24:MI:SS') DESC
Spesso mi trovo anche a selezionare una colonna data / ora unificata (Oracle):
SELECT
TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY ') ||
TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'),
'MM/DD/YYYY HH24:MI:SS') AS MONKEY_DATE_TIME
FROM MONKEY
Perché, quasi sempre, vogliamo sapere la data e l'ora della scimmia.
Il precedente SQL potrebbe essere facilmente modificato in:
SELECT MONKEY_DATE_TIME FROM MONKEY ORDER BY MONKEY_DATE_TIME
... Se solo avessimo colonne unite.
Sfondo
Ho ereditato un vecchio sistema ASP che memorizza le date e le ore in colonne separate nel database. Mi è stato detto che questo è probabilmente dovuto al fatto che l'applicazione è stata avviata in una versione precedente di Access, in cui non era possibile memorizzare sia la data che l'ora nella stessa colonna. I perché e i come non fanno realmente parte di questa domanda, ma alcune persone amano sapere.
P.S.
L'ho davvero pubblicato in SO.SE, quindi mi scuso se ho trovato il sito sbagliato.