Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Konwersja daty do formatu timestamp
Forum PHP.pl > Forum > Bazy danych > MySQL
SeaDog
Witajcie, mam problem z konwersją daty do formatu timestamp.

W bazie danych znajdują się pola typu: DATE i DATETIME
Chcę wykonać zapytanie, które zliczy ilość rekordów dodanych w ostatnim tygodniu.
Zapytanie ma być bardzo dokładne, dlatego też chcę połączyć pola "date" i "time", żeby uwzględniane były również godziny, minuty, sekundy
i skonwertować je do formatu timestamp a następnie porównać z datą obecną.

Gdy używam samego pola date, wszystko jest ok.
Jeśli łączę pola funkcją concat i do funkcji unix_timestamp wrzucam nazwę połączonych pól,
wtedy poniższe zapytanie zwraca błąd.

  1. mysql_query("SELECT count(*),concat(date,time) as data WHERE unix_timestamp(DATE_ADD(data, INTERVAL + 7 DAY)) < unix_timestamp(NOW())");


W czym może być problem?
Crozin
Bo UNIX_TIMESTAMP() oczekuje jako argumentu daty (i czasu), a nie tekstu.

Po co w ogóle konwertujesz do formy timestampu? Jedna kolumna typu DATETIME (czemu masz osobne?) i przy pomocy normalnych funkcji do porównywania dat wyszukaj te sprzed tyg.
SeaDog
Upss... nastąpiła mała pomyłka. Mam osobne pola dla daty i czasu. Jedno pole jest typu DATE,
drugie typu TIME. Rozdzieliłem czas i datę.
Tak się teraz zastanawiam i faktycznie lepiej by było, gdyby było jedno pole typu DATETIME.
Dlaczego konwertuję do czasu Unixowego?...
Mam skrypt PHP, który sprawdza odległość czasową i tak dla przykładu:
Jeśli użytkownik wystawi komentarz, to musi upłynąć cały jeden dzień, żeby mógł wystawić następny.
W tym celu użyłem funkcji strtotime();, czyli też po prostu zamieniłem czas na czas unixowy.
Tak samo chciałem zrobić z zapytaniem MySql.

Crozin, czyli sugerujesz zamienić te dwa pola na jedno i nie bawić się z UNIX_TIMESTAMP?
Tak czy siak do sprawdzanej daty muszę dodać 7 dni. Następnie porównuję ją z obecną.
Zatem jak powinno wyglądać takie zapytanie? Wystarczy sam operator porównania: "<" ?
Crozin
Tak, wystarczy sam operator porównania:
  1. ... WHERE created_at > DATE_SUB(NOW(), INTERVAL 7 DAY) ...
SeaDog
Poprawiłem strukturę bazy danych, kod też zmieniłem i teraz bardzo ładnie to wszystko działa.
Dokładnie o taki efekt mi chodziło biggrin.gif

Tylko mam jeszcze pytanko tak z czystej ciekawości.
Crozin, po co użyłeś tego parametru/funkcji created_at >? bez tego też działa.
Crozin
Uznałem, że kolumna z datą utworzenia to właśnie created_at, a Ty przecież chcesz wyszukać tylko te rekordy w których data dodania (czyli ta kolumna) zawiera datę nie starszą (>) niż 7 dni (DATE_SUB(...)).
SeaDog
No tak, racja, nie załapałem.

Moje zapytanie wygląda tak:

  1. mysql_query("SELECT * FROM comment WHERE date > DATE_SUB(NOW(), INTERVAL + 7 DAY) ORDER BY date DESC");


czyli raczej wszystko jest ok biggrin.gif

Dziękuję za szybkie odpowiedzi i 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.