Avatar billede loevstroem Nybegynder
10. april 2010 - 18:02 Der er 16 kommentarer og
1 løsning

Hjælp til select date uge

Hej Eksperter,

Jeg forsøger at lave en SELECT der henter en COL hvor col_date (et felt i datetime) er indenfor en bestemt uge.

I dette tilfælde vil jeg hente alle posts der er lavet i uge 10.

Er der en smart metode, til at hente rækker, baseret på hvilken uge de er posted?

Jeg har umiddelbart ikke kunne finde nogen metode til dette formål i mysqls dokumentationen.

PFT.
10. april 2010 - 18:48 #1
Du kan bruge mysql funktionen WEEK.  For eksempel SELECT WEEK('2010-01-10' returnerer vaerdien 2.

Jeg lavede en lille tabel med et par vaerdier som jeg giver nedenfor.  Forespoergslen SELECT naam, dato FROM loevstroem WHERE 2 = (SELECT WEEK(dato)) gav svaret:

navn  dato 
navn2 2010-01-10

Her er tabellen og vaerdierne:

CREATE TABLE loevstroem(navn varchar(10), dato DATE);

INSERT INTO loevstroem VALUES('navn1', '2010-01-01');
INSERT INTO loevstroem VALUES('navn2', '2010-01-10');
INSERT INTO loevstroem VALUES('navn3', '2010-01-20');

Jeg haaber det besvarer spoergsmaalet.
Avatar billede amite Mester
10. april 2010 - 18:50 #2
WHERE WEEK( col_date ) = '10'
Avatar billede erikjacobsen Ekspert
10. april 2010 - 20:32 #3
Du kan vel beregne (i fx PHP hvis du bruger det) startdato og slutdato for ugen, og dermed spare en beregning med week.

Det er heller ikke nok at bruge ugenummeret i det eksempel, som Christian kommer med - der skal også bruges årstal.
10. april 2010 - 21:05 #4
erikjacobsen, forklar naermere om din udtalelse at "det er heller ikke nok at bruge ugenummeret i det eksempel som Christian kommer med - der skal ogsaa bruges aarstal?" Ifoelge teorien og mine tests giver WEEK('2009-02-03') korrekt ugenummer for 2009, WEEK('2010-02-03') korrekt ugenummer for 2010, o.s.v. 

Eller taler du om noget andet? 

(Yderligere var spoergsmaalet oprettet i kategorien MySQL og drejer sig om hvordan man med et SELECT statement traekker raekker ud for et bestemt ugenummer, og det rettede jeg mig efter i mit svar.)
Avatar billede erikjacobsen Ekspert
10. april 2010 - 22:33 #5
Man vil aldrig kun bede om ugenummer "10" fx. Det vil altid være uge nummer "10" i et bestemt år - med mindre selvfølgelig tabellen kun indeholder data fra en periode på mindre end et år.
10. april 2010 - 23:32 #6
erikjacobsen, ja, selvfoelgelig.  Nu faldt tioeren.  Hvordan kunne jeg tvivle?

Det maa vi give tilbage til spoergsmaals-stilleren.  Loevstroem, hvis du vil have det der er posted i uge 10 saa maa vi, ifoelge erikjacobsen og (omsider) mig spoerge "uge 10 i hvilket aar?"  Hvis i 2010 saa maa querien blive noget lignende som:

SELECT * FROM loevstroem WHERE YEAR(dato) = '2010' AND WEEK(dato) = 10;

erikjacobsen, er vi enige?
Avatar billede erikjacobsen Ekspert
10. april 2010 - 23:39 #7
Nemlig.

Det bringer os så tilbage til problematikken omkring brugen af beregninger på felter i tabellen. Generelt vil dette forhindre brugen af indexer på disse felter, og dermed gennemtvinge et gennemløb af hele tabellen. Det er ok hvis tabellen er lille, men et no-no hvis tabellen er stor.

Man overtræder første normalform ved at benytte WEEK og YEAR funktionerne,

Derfor mit simple forslag

  SELECT ... WHERE dato>='2010-04-XX' AND dato<'2010-04-YY'

hvor man een gang for alle beregne start og slutdato for en given uge.
10. april 2010 - 23:59 #8
erikjacobsen, tre kommentarer:

(1) sidste indlaeg idag.  Af to aarsager:  (a) det er langt over normal sengetid i Belgien.  (b)  Hvis jeg alligevel bliver ved saa er det snart i morgen.

(2) Jeg er uenig med dig (maaske kun til du forklarer mere og jeg pludselig ser dagens lys.)  Den maaede man stiller spoergsmaal paa har (ifoelge hvad jeg har laert) intet at goere med normalisering.  Den tabel jeg gav i indlaeg #1 er (ifoelge min mening) 5N (den er 3N, men fordi den er saa simpel er den ogsaa BCN og 4N of 5N.)

(3) Men formaalet med denne traad er ikke at du og jeg diskuterer normalisering (skoent det er interressant) men at hjaelpe spoergsmaalsstilleren med hans oprindelige spoergsmaal.  Hvis Loevstroem gerne vil soege paa indlaeg indenfor en uge og maaske benytte en parameter dertil, skoent mit svar #1 var utilstraekkelig mener jeg stadig at mit svar #6 er korrekt.
Avatar billede erikjacobsen Ekspert
11. april 2010 - 00:16 #9
Man kan ikke sige om en tabel er på 1. normalform uden at kigge på hvilke forespørgsler man laver på tabellen.

Jeg giver gerne spørgeren oplysninger ud over det, der spørges om ;)
11. april 2010 - 01:10 #10
God Soendag.  Jeg skulle have vaeret i seng for lenge side.  Mem....

Engang, i et meget tidligere aarhundrede, jeg tror omkring 1978, fandt jeg, paa biblioteket, en bog skrevet af en der hed Codd.  (Paa hollandsk (det sprog jeg snakker med min hollandske kone) betyder det torsk.)  Jeg fandt bogen saerdeles interssant.  Codd sagde udtrykkelig at hans bog ikke beskaeftigede sig med computer systemer der kunne udfoere hans teorier.  (Saadanne computer systemer fandtes heller ikke foer Oracke og IBM omkring 1982 begyndte at udvikle dem for Relational Database Management Systems.)

Jeg tror jeg blev forelsket i Codds teorier, og det er jeg stadigvaek.  Det er rendyrket logik!

Men det er nu laenge siden jeg har dykket dybt i teorien.  Fra det jeg husker tager du fejl.  Normalisering har intet som helst at goere med de forespoergsler man laver paa en tabel, kun med strukturen af de data der sidder i tabellen.

Har du forstaaet normalisering paa en anden maade saa forklar.

(Og det har intet at goere med det oprindelige spoergsmaal.  loevstroem, en reaktion pse.
Avatar billede loevstroem Nybegynder
11. april 2010 - 02:24 #11
Tak for jeres fine svar - begge to.

Umiddelbart synes jeg ikke det virker helt efter hensigten. Jeg får returneret antallet af poster i denne uge. Dog bliver de nye oprettet i dag, søndag ikke talt med - er der evt. en metode til at tjekke hvornår date starter ugen eller konfigurere den?

Christian smid et svar :)
Avatar billede loevstroem Nybegynder
11. april 2010 - 02:26 #12
Jeg synes ikke umiddelbart det virker efter hensigten. Dagens poster i dag, søndag bliver ikke talt med. Er der en metode til at konfigurere ugens start til mandag?

Christian smid et svar :)
Avatar billede arne_v Ekspert
11. april 2010 - 04:19 #13
Avatar billede arne_v Ekspert
11. april 2010 - 04:22 #14
Hvis performance ikke er en vigtig faktor kunne man overveje:

... WHERE DATE_FORMAT(felt,'%x %v')='2010 10'
Avatar billede arne_v Ekspert
11. april 2010 - 04:23 #15
Jeg er iøvrigt enig med Christian - omskrivning til dato interval er en optimering for at udnytte index - det har ikke noget med data normalisering at gøre.
11. april 2010 - 08:12 #16
Svar fra Christian-Belgien.
Avatar billede loevstroem Nybegynder
11. april 2010 - 12:02 #17
I skal alle 3 have mange tak for jeres kompetente svar :- )
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