Hvis selve udtrækket skal laves i pl/sql kan du bruge declare v_period integer:=14; start_date date:=sysdate-(to_number(to_char(sysdate,\'D\'))-1); end_date date:=sysdate-(to_number(to_char(sysdate,\'D\'))-1)+v_period;
og så selecte noget med ... between start_date and end_date
Oracle har en dejlig funktion, der hedder TRUNC. Med den behøver du heller ikke tænke på tids-delen af datoen :
SELECT * FROM Kalender WHERE KalenderDato >= TRUNC(SYSDATE,\'DAY\') AND KalenderDato < TRUNC(SYSDATE,\'DAY\') + 14;
Denne query giver dig perioden fra mandag i indeværende uge kl. 00:00:00 til søndag 14 dage efter kl. 23:59:59. Bemærk at \'DAY\' formatet til TRUNC giver dig første dag i ugen baseret på Oracle parameteren NLS_TERRITORY - dvs. at hvis din Oracle er sat op til f.eks. Amerikansk territorium, så går ugen fra søndag til lørdag !
Din query nummer 2 bliver nu til
SELECT * FROM Kalender WHERE Oprettet >= TRUNC(SYSDATE,\'DAY\') AND Oprettet < TRUNC(SYSDATE,\'DAY\') + 7;
Det giver de aftaler, der er oprettet i indeværende uge.
kibeha\'s løsning må siges at være den pæneste, selvom jeg i så fald ville benytte TRUNC(sysdate,\'ww\') der altid rammer mandag uanset hvilket territorie man er i.
TRUNC(SYSDATE,\'WW\') rammer samme ugedag som den 1.januar i året !! Dvs. at i 2001, hvor 1.januar er en mandag, rammer den altid mandag, det er rigtigt. Man i f.eks. 2000, hvor 1.januar er en lørdag, rammer den altid lørdag - dvs. regner en uge som lørdag til søndag ....
I stedet har jeg fundet IW (ISO Week) og IYYY (ISO Year), som vist må være det allerbedste at bruge ... (jeg medgiver, at min egen DAY er afhængig af territorie, men WW er nu altså lidt værre i min mening :-)
Følgende selects :
select trunc(to_date(\'01-01-2000\',\'DD-MM-YYYY\'),\'IW\') jan1, to_char(to_date(\'01-01-2000\',\'DD-MM-YYYY\'),\'IW IYYY\') jan_1 from dual; select trunc(to_date(\'02-01-2000\',\'DD-MM-YYYY\'),\'IW\') jan2, to_char(to_date(\'02-01-2000\',\'DD-MM-YYYY\'),\'IW IYYY\') jan_2 from dual; select trunc(to_date(\'03-01-2000\',\'DD-MM-YYYY\'),\'IW\') jan3, to_char(to_date(\'03-01-2000\',\'DD-MM-YYYY\'),\'IW IYYY\') jan_3 from dual; select trunc(to_date(\'04-01-2000\',\'DD-MM-YYYY\'),\'IW\') jan4, to_char(to_date(\'04-01-2000\',\'DD-MM-YYYY\'),\'IW IYYY\') jan_4 from dual; select trunc(to_date(\'05-01-2000\',\'DD-MM-YYYY\'),\'IW\') jan5, to_char(to_date(\'05-01-2000\',\'DD-MM-YYYY\'),\'IW IYYY\') jan_5 from dual; select trunc(to_date(\'06-01-2000\',\'DD-MM-YYYY\'),\'IW\') jan6, to_char(to_date(\'06-01-2000\',\'DD-MM-YYYY\'),\'IW IYYY\') jan_6 from dual; select trunc(to_date(\'07-01-2000\',\'DD-MM-YYYY\'),\'IW\') jan7, to_char(to_date(\'07-01-2000\',\'DD-MM-YYYY\'),\'IW IYYY\') jan_7 from dual; select trunc(to_date(\'08-01-2000\',\'DD-MM-YYYY\'),\'IW\') jan8, to_char(to_date(\'08-01-2000\',\'DD-MM-YYYY\'),\'IW IYYY\') jan_8 from dual; select trunc(to_date(\'09-01-2000\',\'DD-MM-YYYY\'),\'IW\') jan9, to_char(to_date(\'09-01-2000\',\'DD-MM-YYYY\'),\'IW IYYY\') jan_9 from dual; select trunc(to_date(\'10-01-2000\',\'DD-MM-YYYY\'),\'IW\') jan10, to_char(to_date(\'10-01-2000\',\'DD-MM-YYYY\'),\'IW IYYY\') jan_10 from dual; /
giver følgende resultat :
JAN1 JAN_1 --------- ------- 27-DEC-99 52 1999
JAN2 JAN_2 --------- ------- 27-DEC-99 52 1999
JAN3 JAN_3 --------- ------- 03-JAN-00 01 2000
JAN4 JAN_4 --------- ------- 03-JAN-00 01 2000
JAN5 JAN_5 --------- ------- 03-JAN-00 01 2000
JAN6 JAN_6 --------- ------- 03-JAN-00 01 2000
JAN7 JAN_7 --------- ------- 03-JAN-00 01 2000
JAN8 JAN_8 --------- ------- 03-JAN-00 01 2000
JAN9 JAN_9 --------- ------- 03-JAN-00 01 2000
JAN10 JAN_10 --------- ------- 10-JAN-00 02 2000
JAN10 JAN_10 --------- ------- 10-JAN-00 02 2000
SQL>
Bemærk at IW i formatet i TRUNC giver datoen for mandag i ugen, mens IW i formatet i TO_CHAR returnerer ugenummeret. Her har jeg også brugt IYYY for at finde året, da 1/1-2000 er i uge 52 i år 1999 !
Der er en bug i 7.3.4 og op samt i tidlige 8.0.x versioner, så TRUNC(dato,\'IW\') giver fejl på alle lørdage ..... De bliver TRUNC\'et til at høre med til NÆSTE UGE :-)
Det er fixet i hvert fald i 8.1.x og nyere.
TO_CHAR(dato,\'IW IYYY\') derimod giver det rigtige resultat også i ældre Oracle\'r ...
Spørg mig ikke hvad Oracle har imod lørdage .....:-)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.