Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie z datami urodzin
Forum PHP.pl > Forum > Bazy danych > MySQL
MySQL
Jest taka tabela (w pseudokodzie 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.
singles
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\")"
MySQL
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
sowiq
  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)
MySQL
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 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?
dymsza
  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
MySQL
Ooo a to jest niezle rozwiazanie 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 winksmiley.jpg

Wszystkim dziekuje za pomoc
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.