2013-04-18 12 views
5

Ho una colonna datetime in Oracle (GG/MM/AAAA HH: MM: SS AM/PM), ma quando faccio questo:Sottrai un'ora da datetime piuttosto di un giorno

SELECT MAX(D_DTM)-1 FROM tbl1 

. ... torna un giorno. Come faccio a rimuovere un'ora dalla colonna anziché un giorno?

Ho anche notato che i datetime record per aspetto 12:00 come MM/DD/YYYY e non MM/DD/YYYY 00:00:00; Non sono sicuro che sia importante.

+0

Come stai visualizzando i valori 12AM? È attraverso SQLPlus o un linguaggio front-end (C#, PHP, ecc. Ecc.)? –

+0

utilizzando Toad, è il front end del problema?Sono nuovo l'Oracle env – user2061886

+0

Potrebbe essere una cosa da TOAD, ma non ho familiarità con TOAD. Se tutte le altre date nella colonna mostrano il componente orario e le date "mezzanotte" no, penso che sia sicuro presumere che la "mezzanotte" sia davvero lì e che TOAD sia solo "utile" a nasconderlo. Potrebbe esserci un'impostazione in cui è possibile attivare o disattivare questa funzione, ma è solo un'ipotesi. So che i linguaggi .NET e PHP riconosceranno la porzione del tempo, anche se è zero, e probabilmente lo saranno anche tutti gli altri linguaggi. –

risposta

13

Randy's answer è buono, ma si può anche utilizzare intervalli:

SELECT MAX(D_DTM)- interval '1' hour FROM tbl1 
+0

rispondere meglio IMO, più chiaro per i futuri programmatori per sapere cosa sta succedendo – user2061886

4

sì - le date passano per giorni interi.

se si vuole ora è necessario fare un po 'di matematica - come -(1/24)

5

oppure utilizzare la funzione INTERVAL. Ha lo stesso risultato, ma penso che si legge più chiaramente - che è ovviamente solo un parere :)

SELECT MAX(D_DTM) - INTERVAL '1' HOUR FROM tbl1 

La cosa bella sulla funzione INTERVAL è che si può fare l'intervallo di essere anni, mesi, giorni, ore , minuti o secondi quando si ha a che fare con un valore DATE, sebbene l'intervallo mensile possa essere complicato quando si ha a che fare con le date di fine mese.

E sì, la citazione intorno allo 1 nell'esempio è richiesta.

È inoltre possibile utilizzare la NumToDSInterval funzione di Oracle-specifica, che è meno standard, ma più flessibile, perché accetta le variabili invece di costanti:

SELECT MAX(D_DTM) - NUMTODSINTERVAL(1, 'HOUR') FROM tbl1 
2

Un altro metodo di intervalli utilizzando è

NUMTODSINTERVAL(number, expression) 

esempi

NUMTODSINTERVAL(150, 'DAY') 
NUMTODSINTERVAL(1500, 'HOUR') 
NUMTODSINTERVAL(15000, 'MINUTE') 
NUMTODSINTERVAL(150000, 'SECOND') 

Io porto questo fino a quando usarlo è utile in situazioni in cui l'uso di INTERVAL non funziona.

4
select sysdate - numtodsinterval(1,'hour') from dual 
1

È semplice.

sysdate - 5/(24 * 60 * 60) -> Sottrae 5 secondi dal systime

sysdate - 5/(24 * 60) -> Sottrae a 5 minuti dal systime

sysdate - 5/(24) -> Sottrae 5 ore da systime

Quindi

select (sysdate - (1/24)) dal doppio

+0

Puoi espandere un po 'di più sulla tua risposta, ad esempio perché stai usando la divisione per sottrarre? –

+0

@CodyGuldner La divisione sta calcolando il valore come frazione di giorni. (1 ora è 1/24 di un giorno, quindi 5/24 giorni è di 5 ore.) La sottrazione quindi sottrae il giorno. Personalmente, però, sarei preoccupato per gli errori in virgola mobile. – jpmc26

+0

@ jpmc26 L'idea è che le informazioni come quella dovrebbero essere incluse nella risposta. –

Problemi correlati