2014-10-03 14 views

risposta

10

per selezionare la data corrente (oggi) prima della mezzanotte (un secondo prima) è possibile utilizzare una delle seguenti dichiarazioni:

SELECT TRUNC(SYSDATE + 1) - 1/(24*60*60) FROM DUAL 
SELECT TRUNC(SYSDATE + 1) - INTERVAL '1' SECOND FROM DUAL; 

Cosa fa:

  1. Sum un giorno a SYSDATE: SYSDATE + 1, ora la data è Domani
  2. Rimuovi ora parte della data con TRUNC, ora la data è Domani alle 00:00
  3. Sottrarre un secondo dalla data: - 1/(24*60*60) o - INTERVAL '1' SECOND FROM DUAL, ora la data è oggi al 11:59:59

Nota 1: Se si desidera controllare gli intervalli di data che si potrebbe desiderare di controllare @Allan risposta qui sotto .

Nota 2: In alternativa è possibile utilizzare questo altro (che è più facile da leggere):

SELECT TRUNC(SYSDATE) + INTERVAL '23:59:59' HOUR TO SECOND FROM DUAL; 
  1. rimuovere parte ora della data corrente con TRUNC, ora la data è oggi alle 00:00
  2. Aggiungere un intervallo di tempo di 23:59:59, ora la data è Oggi alle 11:59:59

Nota 3: Per controllare i risultati che si potrebbe desiderare di aggiungere Formato:

SELECT TO_CHAR(TRUNC(SYSDATE + 1) - 1/(24*60*60),'yyyy/mm/dd hh24:mi:ss') FROM DUAL 
SELECT TO_CHAR(TRUNC(SYSDATE + 1) - INTERVAL '1' SECOND,'yyyy/mm/dd hh24:mi:ss') FROM DUAL 
SELECT TO_CHAR(TRUNC(SYSDATE) + INTERVAL '23:59:59','yyyy/mm/dd hh24:mi:ss') FROM DUAL 
+1

Perché hai bisogno di un'espressione per ottenere un valore che non cambierà mai: è una costante. Perché non ti concateni solo "23: 59: 59" o "11:59:59 pm" fino ad oggi? –

+1

@ Caffé: se tutto ciò che stai facendo è visualizzarlo, allora va bene. Se stai facendo un qualsiasi tipo di elaborazione sulla data, concatenare il tempo su di esso richiede due conversioni di tipo, mentre l'espressione non richiede alcuna. – Allan

+0

@ Caffé: Non è sicuro se concatenando uno finisce con un'altra espressione, potresti fornire un esempio? Grazie! – gaboroncancio

3

La vera ambiguità è probabilmente con leap seconds e forse l'ora legale (ma non so se c'è qualche caso in cui si cambia ad mezzanotte o meno).

In ogni caso, per il caso di consueto, ci sono poche soluzioni:

-- all of these will produce a `DATE` result: 
SELECT TRUNC(SYSDATE+1)-1/86400 FROM DUAL; 
SELECT TRUNC(SYSDATE+1) - INTERVAL '1' SECOND FROM DUAL; 
SELECT TRUNC(SYSDATE) + INTERVAL '23:59:59' HOUR TO SECOND FROM DUAL; 

Alcuni piccoli stranezze se si utilizza timestamp però:

  • TRUNC silenziosamente convertire il valore in DATE;
  • L'aggiunta/la sottrazione di un NUMBER a/da un TIMESTAMP produrrà anche DATE. Vedere Datetime/Interval Arithmetic per i dettagli.
-- those two will produce a `DATE` *too*, not a `TIMESTAMP`: 
SELECT TRUNC(SYSTIMESTAMP) + INTERVAL '23:59:59' HOUR TO SECOND FROM DUAL; 

SELECT TO_TIMESTAMP(TRUNC(SYSTIMESTAMP+1))-1/86400 FROM DUAL; 
+1

La terza opzione del primo set è perfetta per la leggibilità e le prospettive logiche. È positivo che Oracle fornisca questa funzionalità ed è triste che molte persone che documentano soluzioni per questo continuino a utilizzare soluzioni più strane. –

6

Personalmente, non mi piace utilizzando un secondo prima di mezzanotte.Tra le altre cose, se si utilizza un timestamp, esiste la possibilità che il valore che si sta confrontando cada tra gli spazi vuoti (ad esempio 23: 59: 59.1). Poiché questo tipo di logica viene in genere utilizzato come limite per una condizione di intervallo, suggerisco di utilizzare "meno di mezzanotte", anziché "meno di o uguale a un secondo prima di mezzanotte", se possibile. Anche la sintassi per questo semplifica. Per esempio, per ottenere un intervallo di tempo che rappresenta "oggi", è possibile utilizzare una delle seguenti operazioni:

date_value >= trunc(sysdate) and date_value < trunc(sysdate) + 1 
date_value >= trunc(sysdate) and date_value < trunc(sysdate) + interval '1' day 

E 'un po' più ingombrante rispetto all'utilizzo between, ma assicura che non avete mai un valore che non rientra della gamma che stai considerando.

+0

+1 Non era esplicito nella domanda se l'intento è il controllo dell'intervallo, ma in questo caso sarà sicuramente un buon approccio. –

Problemi correlati