Domanda

Sto cercando di utilizzare un formato Anno-Settimana in Oracle Oracle per restituire risultati solo da un intervallo di Anni-Settimana.

Ecco cosa sto provando

SELECT * FROM widsys.train trn WHERE trn.WID_DATE>=TO_DATE('2008-13', 'YYYY-IW') AND trn.WID_DATE<=TO_DATE('2008-15', 'YYYY-IW') ORDER BY trn.wid_date

ma rileva questo errore.

ORA-01820: il codice del formato non può apparire nel formato di inserimento della data ma non funziona su ORA

Qualche suggerimento su cosa posso usare?

Grazie gentilmente,

Thomas

È stato utile?

Soluzione

Potresti capovolgerlo e fare un confronto tra stringhe.

 SELECT * 
 FROM widsys.train trn 
 WHERE to_char(trn.WID_DATE, 'YYYY-IW') ='2008-13'
 ORDER BY trn.wid_date;

Suppongo sia logico che to_date () non funzioni con IW, poiché l'inizio della settimana è piuttosto ambiguo: alcuni locali iniziano la settimana di domenica, altri lunedì, ecc. Generando una settimana troncata dell'anno, a differenza di un giorno, mese o anno troncato, sarebbe quindi difficile.

modifica

Sono d'accordo che il tipo naturale dovrebbe essere sufficiente, ma mi hai fatto pensare. Come confronteresti una data specificata e una stringa YYYY-IW formattata? L'ho preso a pugni. Questo tentativo potrebbe essere adattato a una funzione che richiede una data e un varchar formattato AAAA-IW, ma è necessario sostituire le stringhe codificate e le chiamate di funzione to_date () ed eseguire alcune operazioni di pulizia.
Restituisce un -1 se la data passata è precedente all'anno / settimana dell'anno, 0 se la data rientra nella settimana dell'anno specificata e 1 se è successiva. Funziona sulla settimana ISO dell'anno, così come il token del formato "IW".

 select (case 
      when input.day < a.startofweek then -1
      when input.day < a.startofweek+7 then 0
      else 1 end)
 from 
 (select 
 -- //first get the iso offset for jan 1, this could be removed if you didn't want iso 
    (select (max(to_number(to_char(to_date('2008','YYYY') + level,'DDD')))) 
     from dual 
     where to_number(to_char(to_date('2008','YYYY')  + level,'IW')) 
      <2 connect by level <= 6) -6
    +
 -- //next get the days in the year to the month in question   
    (select ((to_number(substr('2008-13', 6,2))-1)*7) from dual) startofweek 
     from dual) a, 
 -- //this is generating a test date
  (select to_number(to_char(to_date('2008-07-19', 'YYYYMMDD'), 'DDD')) day 
    from dual) input, 
  dual

Altri suggerimenti

Che ne dici

select * from widsys.train trn 
  where to_char(trn.wid_date, 'YYYY-IW') =  ?
  order by trn.wid_date

e per intervalli

select * from widsys.train trn 
  where to_char(trn.wid_date, 'YYYY-IW') between ? and ?
  order by trn.wid_date

L'intervallo utilizzerà confronti di stringhe, che funzionano bene se i numeri più piccoli sono a zero:  & Quot; 2009-08 " e non "2009-8". Ma il formato 'IW' fa questa imbottitura.

Preferisco creare una tabella per settimane per ogni anno che corrisponda alla comprensione locale dei miei domini, ma sono solo io.

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