Oracle
 sql >> Database >  >> RDS >> Oracle

Chiamata alla funzione SQL di Oracle PL da Excel VBA

Il tuo lavoro con le date è totalmente errato. È difficile indicare il luogo esatto perché ci sono alcuni posti potenziali. Spiegherò cosa c'è che non va in questo pezzo di codice (è preso dalla tua istruzione "linea 89"):

... FP_BASIC_BD."DATE">=TO_CHAR(TRUNC(TO_DATE(GTT_DWM_STATS.CLOSINGDATE,'DD-MON-YY'), 'IW'),'DD-MON-YY') ...

GTT_DWM_STATS.CLOSINGDATE ha il formato della data (secondo la tua dichiarazione DDL). Ma to_date La funzione accetta una stringa come primo parametro. In questo luogo, Oracle esegue le seguenti operazioni:

  • converte implicitamente la data in una stringa (usando il formato della sessione)
  • poi to_date la funzione tenta di riconvertirla in una data, trattando la stringa come una data scritta in 'DD-MON-YY' formato
  • quindi trunc tronca la data
  • quindi to_char lo converte di nuovo in una stringa e poi confronti la tua stringa con la data (credo) FP_BASIC_BD."DATE"
  • se FP_BASIC_BD."DATE" è una data, Oracle converte implicitamente il risultato dell'espressione a destra del segno di uguale nuovamente in una data
  • o se FP_BASIC_BD."DATE" è una stringa, Oracle confronta le stringhe secondo le regole di un confronto di stringhe.

Quello di cui hai bisogno qui è sbarazzarti di tutte le trasformazioni non necessarie:

FP_BASIC_BD."DATE" >= TRUNC(GTT_DWM_STATS.CLOSINGDATE, 'IW')

E dopo devi controllare attentamente tutte le altre dichiarazioni in cui stai lavorando con le date. Se una funzione accetta una data come parametro di input, devi passare una data, se una funzione accetta una stringa - passa una stringa. Lo stesso con i confronti:confronta una stringa con una stringa e una data con una data.