Avatar billede tipsen Nybegynder
06. juni 2003 - 02:13 Der er 9 kommentarer og
1 løsning

Fødselsdagsstyring vha. sindring forespørgsel.

Hej eksperter

Jeg har en tabel med følgende struktur:

CREATE TABLE people (
  id smallint(5) unsigned NOT NULL auto_increment,
  birthdate date NOT NULL default '0000-00-00',
  firstname varchar(255) NOT NULL default '',
  lastname varchar(255) NOT NULL default '',
  PRIMARY KEY  (id)
) TYPE=MyISAM;

Dvs. en tabel med navne og fødselsdatoer

Jeg har desuden følgende forespørgsel, som finder fornavn, efternavn, antal dage til næste fødselsdag samt alder målt i år ved næste fødselsdag:

SELECT firstname, lastname,
IF (
MONTH (birthdate) > MONTH (CURDATE()) OR
MONTH (birthdate) >=MONTH (CURDATE()) AND DAYOFMONTH(birthdate) >= DAYOFMONTH(CURDATE()),
TO_DAYS(CONCAT(YEAR(CURDATE()), DATE_FORMAT(birthdate, '%m%d'))) - TO_DAYS(CURDATE()),
TO_DAYS(CONCAT(YEAR(CURDATE())+1, DATE_FORMAT(birthdate, '%m%d'))) - TO_DAYS(CURDATE())) AS daysuntilbirthday,

DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthdate, '%Y') -
(DATE_FORMAT(CURDATE(), CONCAT(YEAR(CURDATE()),'-%m-%d')) < DATE_FORMAT(birthdate, CONCAT(YEAR(CURDATE()), '-%m-%d'))) + 1 AS bdayage,

birthdate
FROM people
ORDER BY daysuntilbirthday ASC
LIMIT 0, 30

Mit spørgsmål er så om dette ikke kan gøres nemmere og hurtigere - den forespørgsel jeg har bygget op ovenfor er lidt tung i røven og må kunne optimeres en del?

Mvh

tipsen
Avatar billede zapzap Nybegynder
06. juni 2003 - 11:32 #1
Mener at du har en DATEDIFF() til lige det der.
Avatar billede tipsen Nybegynder
06. juni 2003 - 12:06 #2
Den kender jeg ikke - kan du vise, hvordan jeg bruger den?
Avatar billede tipsen Nybegynder
06. juni 2003 - 12:07 #3
Eller rettere, hvordan den passer ind i ovenstående?
Avatar billede zapzap Nybegynder
06. juni 2003 - 14:51 #4
Har kun lige SQL Server dok. i nærheden, men her er deres eksempel:
SELECT DATEDIFF(day, pubdate, getdate()) AS no_of_days
FROM titles

hvor pubdate er en kolonne i titles, og getdate() er 'nu'=curdate(). 'day' siger til datediff at du vil have dage, du kan også få sekunder, uger etc.
F.eks. alder målt i år ville så være
datediff(year, birthdate, curdate())
Avatar billede tipsen Nybegynder
07. juni 2003 - 23:13 #5
Synes ikke jeg kan finde funktionen i MySQL og samtidig kan jeg ikke se, hvordan den skal passe ind i ovenstående...
Avatar billede roo104 Nybegynder
08. juni 2003 - 19:33 #6
Avatar billede tipsen Nybegynder
08. juni 2003 - 20:21 #7
roo104: Kender jeg godt - har du et konkret forslag?
Avatar billede tipsen Nybegynder
09. juni 2003 - 17:56 #8
I første omgang er jeg nået ned på:

SELECT CONCAT(firstname, ' ', lastname) as name,
IF (
MONTH (birthdate) > MONTH (CURDATE()) OR
MONTH (birthdate) >=MONTH (CURDATE()) AND DAYOFMONTH(birthdate) >= DAYOFMONTH(CURDATE()),
TO_DAYS(CONCAT(YEAR(CURDATE()), DATE_FORMAT(birthdate, '%m%d'))) - TO_DAYS(CURDATE()),
TO_DAYS(CONCAT(YEAR(CURDATE())+1, DATE_FORMAT(birthdate, '%m%d'))) - TO_DAYS(CURDATE())) AS daysuntilbirthday,

DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthdate, '%Y') -
(DATE_FORMAT(CURDATE(), '%m-%d') > DATE_FORMAT(birthdate, '%m-%d')) AS age,

CONCAT(DAYOFMONTH(birthdate), '/', MONTH(birthdate)),
email
FROM people
ORDER BY daysuntilbirthday ASC
LIMIT 0, 10

Dvs. aldersberegningen er forsimplet.
Avatar billede tipsen Nybegynder
09. juni 2003 - 18:50 #9
Ekstra begrænset til:

SELECT firstname, lastname,

TO_DAYS(CONCAT(YEAR(CURDATE())+((DATE_FORMAT(CURDATE(), '%m-%d') > DATE_FORMAT(birthdate, '%m-%d'))), DATE_FORMAT(birthdate, '%m%d'))) - TO_DAYS(CURDATE()) AS daysuntilbirthday,

DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthdate, '%Y') + (DATE_FORMAT(CURDATE(), '%m-%d') > DATE_FORMAT(birthdate, '%m-%d')) AS age,

CONCAT(DAYOFMONTH(birthdate), '/', MONTH(birthdate)),
email
FROM people
ORDER BY daysuntilbirthday ASC
LIMIT 0, 10";
Avatar billede tipsen Nybegynder
11. juni 2003 - 23:40 #10
slutter.
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