Domanda

Devo aggiungere 30 minuti ai valori in una colonna di date Oracle. Lo faccio nella mia dichiarazione SELECT specificando

to_char (date_and_time + (.000694 * 31)

che funziona bene per la maggior parte del tempo. Ma non quando il tempo è sul confine AM / PM. Ad esempio, l'aggiunta di 30 minuti a 12:30 [che è PM] restituisce 1:00 che è AM. La risposta che mi aspetto è 13:00 . Qual è il modo corretto per farlo?

È stato utile?

Soluzione

Tutte le altre risposte sono fondamentalmente giuste, ma non credo che nessuno abbia risposto direttamente alla tua domanda originale.

Supponendo che " date_and_time " nel tuo esempio è una colonna con tipo DATE o TIMESTAMP, penso che devi solo cambiare questo:

to_char(date_and_time + (.000694 * 31))

a questo:

to_char(date_and_time + (.000694 * 31), 'DD-MON-YYYY HH24:MI')

Sembra che il formato della data predefinito utilizzi " HH " codice per l'ora, non "HH24".

Inoltre, penso che il tuo termine costante sia al tempo stesso confuso e impreciso. Immagino che ciò che hai fatto sia calcolare che (.000694) è circa il valore di un minuto e lo stai moltiplicando per il numero di minuti che vuoi aggiungere (31 nell'esempio, anche se hai detto 30 nel testo).

Vorrei anche iniziare con un giorno e dividerlo per le unità desiderate nel codice. In questo caso, (1/48) sarebbe di 30 minuti; o se volessi romperlo per chiarezza, potresti scrivere ((1/24) * (1/2)).

Ciò eviterebbe errori di arrotondamento (ad eccezione di quelli inerenti al virgola mobile che qui dovrebbero essere privi di significato) ed è più chiaro, almeno per me.

Altri suggerimenti

Oltre a poter aggiungere un numero di giorni a una data, puoi utilizzare i tipi di dati di intervallo supponendo che tu sia su Oracle 9i o versione successiva, che può essere leggermente più facile da leggere,

SQL> ed
Wrote file afiedt.buf
SELECT sysdate, sysdate + interval '30' minute FROM dual
SQL> /

SYSDATE              SYSDATE+INTERVAL'30'
-------------------- --------------------
02-NOV-2008 16:21:40 02-NOV-2008 16:51:40
UPDATE "TABLE" 
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute 
WHERE (...)

Dove intervallo è uno dei

  • Anno
  • MESE
  • DAY
  • ORA
  • MINUTE
  • secondo

Se il tipo di dati del campo è data o timestamp, Oracle dovrebbe sempre fornire il risultato corretto se si aggiunge il numero corretto indicato nel numero di giorni (o una frazione corretta di un giorno nel proprio caso). Quindi, se stai cercando di aumentare il valore in 30 minuti, dovresti usare:

select field + 0.5/24 from table;

Sulla base delle informazioni fornite, credo che questo sia quello che hai provato a fare e sono abbastanza sicuro che funzioni.

Non possiamo usarlo

SELECT date_and_time + INTERVAL '20:00' MINUTE TO SECOND FROM dual;

Sono nuovo di questo dominio.

Assicurarsi che Oracle capisca che l'ora di inizio è PM e specificare la maschera di formato HH24 per l'output finale.

SELECT to_char((to_date('12:40 PM', 'HH:MI AM') + (1/24/60) * 30), 'HH24:MI') as time
  FROM dual

TIME
---------
13:10

Nota: il 'AM' in HH: MI è solo il segnaposto per l'indicatore del meridiano AM / PM. Potrebbe anche essere 'PM'

Sulla base di ciò che stai chiedendo, vuoi il formato HH24: MI per to_char.

Per modificare la data in Oracle puoi provare

  select to_char(<columnName> + 5 / 24 + 30 / (24 * 60),
           'DD/MM/RRRR hh:mi AM') AS <logicalName> from <tableName>

piace molto facilmente

Ho aggiunto 10 minuti alla data di sistema e preferisco sempre utilizzare le funzioni del server Db non una personalizzata.

select to_char(sysdate + NUMTODSINTERVAL(10,'MINUTE'),'DD/MM/YYYY HH24:MI:SS') from dual;
SELECT to_char(sysdate + (1/24/60) * 30, 'dd/mm/yy HH24:MI am') from dual;

semplicemente puoi usarlo con vari formati di data ....

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