Avatar billede askhoej Praktikant
08. februar 2001 - 12:35 Der er 10 kommentarer og
1 løsning

SQL Query

Jeg skal fra en kalender database hente nogle forskellige aftaler.

Databasen \'Kalender\':
ID            Autonumber
KalenderDato  Date
Aftale        Text
Oprettet      Date

1.) Jeg skal hente de aftaler som sker i denne uge og næste uge.

2.) Jeg skal hente de aftaler der er blevet oprettet den seneste uge.

Hvordan gør man nemmest det med ugerne?
Avatar billede kasseper Nybegynder
08. februar 2001 - 12:37 #1
Bruger du et front end sprog, eller skal det laves direkte i oracle, altså med SQL og ikke andet...?
Avatar billede seider Nybegynder
08. februar 2001 - 12:40 #2
select * from din_database where Weeknr(oprettet) = weeknr(now())

jeg kan ikke huske den korekte syntax, men det er et eller andet som det her, læs manualen / help\'en

select * from din_database where Weeknr(oprettet) = (weeknr(now()) or weeknr (now()) +1).

Virker sikkert ikke, man skal garanteret alve et hack til oracle

/* seider */
Avatar billede doeleman Nybegynder
08. februar 2001 - 12:44 #3
I MySQL kan du køre følgende query, mon ikke den gælder for SQL generelt?

SELECT * FROM Kalender WHERE (WEEK(KalenderDato,1) = (WEEK(now(),1)) OR (WEEK(KalenderDato,1) = (WEEK(now(),1)+1)

SELECT * FROM Kalender WHERE WEEK(Oprettet,1) = WEEK(now(),1);
Avatar billede doeleman Nybegynder
08. februar 2001 - 12:46 #4
Faktisk skal nu nok bruge YEARWEEK(date,1) istedet, så du får årstallet med. 1-tallet angiver at ugen starter med mandag (standard er søndag).
Avatar billede askhoej Praktikant
08. februar 2001 - 12:51 #5
Det skal gøres på en ASP side og skal hentes med PL/SQL fra en Oracle DB
Avatar billede teepee Nybegynder
08. februar 2001 - 13:27 #6
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

Avatar billede kibeha Nybegynder
19. februar 2001 - 14:59 #7
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.
Avatar billede teepee Nybegynder
20. februar 2001 - 15:24 #8
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.
Avatar billede askhoej Praktikant
20. februar 2001 - 19:35 #9
Undskyld jeg har glemt at lukke spørgsmålet, jeg endte med at bruge teepee\'s løsning - så point til ham. Tak for hjælpen.
Avatar billede kibeha Nybegynder
09. marts 2001 - 13:10 #10
Måske en lidt sen kommentar, men alligevel ...

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 !
Avatar billede kibeha Nybegynder
09. marts 2001 - 13:36 #11
Åh jo, forresten.

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 .....:-)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester