Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zapytanie z datami urodzin
MySQL
post
Post #1





Grupa: Zarejestrowani
Postów: 71
Pomógł: 4
Dołączył: 3.06.2008

Ostrzeżenie: (0%)
-----


Jest taka tabela (w pseudokodzie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ):

user
{
nazwisko VARCHAR(255),
birthdate DATE
}

Jak zadac zapytanie do bazy, ktore pobierze te wiesze z tej tabeli, dla ktorych uzytkownicy obchodza urodziny w przeciagu np. 7 dni od dzisiaj (to znaczy od daty wywolania tego zapytania)?

Mecze sie juz pol dnia i nie moge nic sensownego wymyslic.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
sowiq
post
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


http://dev.mysql.com/doc/refman/5.1/en/dat...nction_datediff
http://dev.mysql.com/doc/refman/5.1/en/dat...ml#function_now
Go to the top of the page
+Quote Post
singles
post
Post #3





Grupa: Zarejestrowani
Postów: 121
Pomógł: 26
Dołączył: 2.07.2007

Ostrzeżenie: (0%)
-----


Wyciągnięte ze starego skryptu działającego podobnie, powinno się nadać:
  1. SELECT * FROM user WHERE DATE_FORMAT(birthdate, \"%m-%d\") BETWEEN DATE_FORMAT(CURRENT_DATE(), \"%m-%d\") AND DATE_FORMAT(CURRENT_DATE() + 7, \"%m-%d\")"


Ten post edytował singles 4.06.2009, 07:49:32
Go to the top of the page
+Quote Post
MySQL
post
Post #4





Grupa: Zarejestrowani
Postów: 71
Pomógł: 4
Dołączył: 3.06.2008

Ostrzeżenie: (0%)
-----


Napisalem takie zapytanie

  1. SELECT * FROM user WHERE DATE_FORMAT(birthdate, '%m-%d') BETWEEN
  2. DATE_FORMAT(CURRENT_DATE(), '%m-%d') AND DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL 7 DAY), '%m-%d')


I wyskakuje blad nr 1142. A co wiecej nie wiem gdzei w tym zap. jest blad. Skladniowo wyglada poprawnie. Przynajmniej jak dla mnie :/

I przepraszam ze po tak dlugim czasie odpisuje. Troszke zajety bylem innymi projektami
Go to the top of the page
+Quote Post
sowiq
post
Post #5





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


  1. DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL 7 DAY), '%m-%d')
DATE_ADD zwraca format datowy, więc nie musisz traktować tego jeszcze raz DATE_FORMAT. Wystarczy:
  1. DATE_ADD(CURRENT_DATE(), INTERVAL 7 DAY)
Go to the top of the page
+Quote Post
MySQL
post
Post #6





Grupa: Zarejestrowani
Postów: 71
Pomógł: 4
Dołączył: 3.06.2008

Ostrzeżenie: (0%)
-----


Po usunieciu DATE_FORMAT nadal jest blad choc juz inny: #1142
Chociaz wydaje mnie sie ze DATE_FORMAT powinien byc skoro chce wyluskac tylko fragment daty, miesiac i dzien.

Dlaczego mi to nie dziala? Pomalu juz trace nadzieje


_____ Edit: ______________

Dziala (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Napisalem cale zapytanie recznie od poczatku. Widocznie byla jakas literowka.

A jeszcze mi powiedzcie taka rzecz, ktorej nie mam jak sprawdzic bo nie mam aktualnie uprawnien do zmiany daty w BIOSie. Czy takie zapytanie podane przez singles bedzie dzialac w przypadku gdy jest aktualnie np 28 Grudnia a ktos ma wpisana date urodzin na 1 Stycznia?

Ten post edytował MySQL 12.06.2009, 09:22:49
Go to the top of the page
+Quote Post
dymsza
post
Post #7





Grupa: Zarejestrowani
Postów: 62
Pomógł: 4
Dołączył: 24.08.2006

Ostrzeżenie: (0%)
-----


  1. SELECT * FROM user WHERE DATEDIFF(concat(year(NOW()),'-',month(birthdate),'-',day(birthdate)),NOW()) <= 7 AND DATEDIFF(concat(year(NOW()),'-',month(birthdate),'-',day(birthdate)),NOW()) > 0


Ten post edytował dymsza 14.06.2009, 09:08:54
Go to the top of the page
+Quote Post
MySQL
post
Post #8





Grupa: Zarejestrowani
Postów: 71
Pomógł: 4
Dołączył: 3.06.2008

Ostrzeżenie: (0%)
-----


Ooo a to jest niezle rozwiazanie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) proste i przejrzyste. Jednakze ma jedna wade. Nie zadziala w przypadku gdy bylby obecnie np. 30 grudnia 2009, a ktos obchodzilby urodziny za pare dni np. 01 stycznia. Wowczas argumenty DATEDIFF bylyby nastepujace:
DATEDIFF('2009-01-01', '2009-12-30')
A warunek bylby nastepujacy:
  1. DATEDIFF('2009-01-01', '2009-12-30') <= 7 AND DATEDIFF('2009-01-01', '2009-12-30') >= 0

DATEDIFF zwroci wynik -363, a -363 nie nalezy do przedzialu [0, 7].

Ale mozna to prosto poprawic dodajac kolejny warunek
  1. OR
  2. DATEDIFF(CONCAT(YEAR(NOW()) + 1, '-', MONTH(birthdate), '-', DAY(birthdate)), NOW()) <= 7 AND DATEDIFF(CONCAT(YEAR(NOW()) + 1, '-', MONTH(birthdate), '-', DAY(birthdate)), NOW()) >= 0

Nie ma tutaj znaczenia takze przestepnosc roku.

Zatem cale zapytanie ma postac:
Kod
SELECT login
  FROM user
    WHERE
    (
      DATEDIFF(CONCAT(YEAR(NOW()), '-', MONTH(birthdate), '-', DAY(birthdate)), NOW()) >= 0
      AND
      DATEDIFF(CONCAT(YEAR(NOW()), '-', MONTH(birthdate), '-', DAY(birthdate)), NOW()) <= 7
    )
    OR
    (
      DATEDIFF(CONCAT(YEAR(NOW()) + 1, '-', MONTH(birthdate), '-', DAY(birthdate)), NOW()) >= 0
      AND
      DATEDIFF(CONCAT(YEAR(NOW()) + 1, '-', MONTH(birthdate), '-', DAY(birthdate)), NOW()) <= 7
    )

Uzylem kodu bo znaczniki [sql] rozkrzaczyly mi caly kod (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Wszystkim dziekuje za pomoc
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.12.2025 - 03:22