Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Automatyczne usuwanie rekordów z bazy
Forum PHP.pl > Forum > PHP
maciu
W bazie danych jednym z pól tabeli jest DATA. W jaki sposób zrobić, żeby rekordy zostały automatycznie usuwane gdy wartość pola DATA przekroczy prawdziwą date, np. rekord w polu DATA ma wartość 2003-09.13, data ta jest już "historią" więc rekord powiniem zostać automatycznie usunięty.

Wydaje się, że jest to prosta operacja, ale chyba tak nie jest:)
jono
Najlepiej zapisuj ta przyszłą datę w formacie time(), bo wtedy nie będzie problemu z porównaniem:
[php:1:a100724c7f]<?php
if(time() < $czaszbazy){
//i teraz usuwanie tego rekordu
}

?>[/php:1:a100724c7f]
jaco
a nawet:

[php:1:a59670f10c]<?php
mysql_query("DELETE FROM tabela WHERE date<=".time());
?>[/php:1:a59670f10c]
scanner
[php:1:7c983bf610]<?php
mysql_query("DELETE FROM tabela WHERE date<=NOW()");
?>[/php:1:7c983bf610]
maciu
Jeszcze jedno pytanie

Chce zrobić formularz w którym będzie można wybrać dzień, miesiąc i rok i następnie z bazy danych wyświetli rekordy które w polu DATA odpowiadają dacie wybranej w formularzu.
Najłatwiej zrobić to w taki sposób, że w tabeli pole DATA rozdzielić na trzy: dzień, miesiąc i rok. Da się coś takiego zrobić z jednym polem DATA?

Jeszcze jedna uwaga to mojego wcześniejszego pytania. Mówicie, żebym date w bazie zapisywał w formacie TIME, ale przecież format time zapisuje tylko godziny bez daty (GG:MM:SS)
kurtz
Hej
Cytat
Chce zrobić formularz w którym będzie można wybrać dzień, miesiąc i rok i następnie z bazy danych wyświetli rekordy które w polu DATA odpowiadają dacie wybranej w formularzu.  
Najłatwiej zrobić to w taki sposób, że w tabeli pole DATA rozdzielić na trzy: dzień, miesiąc i rok. Da się coś takiego zrobić z jednym polem DATA?
Tak, da sie :)

Jesli to MySQL to masz funkcje MONTH(), DAY() oraz YEAR(). Wiecej o w/w funkcjach oraz w jakiej wersji MySql masz ktora dostepna znajdziesz pod adresem: http://www.mysql.com/doc/en/Date_and_time_..._functions.html

Odnosnie budowania zapytan: zwroc uwage by wybieral DISTINCTa bo inaczej baardzo ci sie rozmnoza wyniki (distinct to znaczy niepowtarzalnie).

Cytat
Jeszcze jedna uwaga to mojego wcześniejszego pytania. Mówicie, żebym date w bazie zapisywał w formacie TIME, ale przecież format time zapisuje tylko godziny bez daty (GG:MM:SS)
W MySQL (pewnie o niego chodzi) masz pole tylko TIMESTAMP. Ono moze przechowywac nie tylko date ale i czas. Wizualnie zalezy to od tego ile znakow przeznaczasz na pole. Masz rowniez do dyspozycji typ Datetime (czyli data i czas). Wiecej o typach zwiazanych z czasem i data: http://www.mysql.com/doc/en/Date_and_time_types.html


Pozdrawiam
maciu
Dzięki Kurtz, zaraz biorę się za lekture mysql

Nie rozumiem tylko Twojego stwierdzenia, że w MySql jest pole tylko typu TIMESTAMP. Przecież pole TIME też jest o czym zresztą jest napisane w postach wyżej.
maciu
coś nie bardzo mi wychodzi

Mam takie pytanie do bazy danych

[php:1:64aa8f0c32]
select * from tabela where DAY(data('$dzien'))
[/php:1:64aa8f0c32]

gdzie:
zmienna $dzien pochodzi z formularza z którego wybieramy liczbe z zakresu 1-31
pole data w bazie ma format TIMESTAMP[8]

Wykonanie tego pokazuje błędy
kurtz
hej
Cytat
Nie rozumiem tylko Twojego stwierdzenia, że w MySql jest pole tylko typu TIMESTAMP. Przecież pole TIME też jest o czym zresztą jest napisane w postach wyżej.
Mysql obsluguje kilka typow pola dla zapisu daty i czasu. TIME sluzy wylcznie do zapsiania godziny, Date daty. DATETIME oraz TIMESTAMP lacza obie funkcjonalnosci. TObie zostawiam wybor zaleznie od potrzeb.


Pozdrawiam
kurtz
Hej
Cytat
coś nie bardzo mi wychodzi

Wyglada na to ze masz solidny blad w zapytaniu

Prawdopodobnie potrzebujesz:
[sql:1:42a1eeb405]
select * from tabela where DAY(data) = '$dzien'
[/sql:1:42a1eeb405]


Podpowiedz: do zapytan sql lepszy (jak widac ;) jest znacznik [sql] a nie [php] ;)


Pozdrawiam
maciu
niestety to zapytanie, które mi podałeś również nie działa. Wyświetla błąd Supplied argument is not a valid MySQL result resource w kodzie mysql_fetch_array($zapytanie);
maciu
już wszystko w porządku.
Zamiast funkcji DAY zastosowałem DAYOFMONTH i działa. To chyba sprawka starej wesji Mysql
maciu
jeszcze jedno zapytanie dotyczące daty

Tabela taka jak w przykładzie wyżej, tylko tym razem ma wyszukiwać rekordy z datą o 4 więcej niż data dzisiejsza. Zrobiłem takie zapytanie:
[sql:1:44c65e6de0]
select * from tabela where data(NOW(), INTERVAL 4 DAY)
[/sql:1:44c65e6de0]

próbowałem równeż

[sql:1:44c65e6de0]
select * from tabela where data(NOW() + INTERVAL 4 DAY)
[/sql:1:44c65e6de0]

ale rówenież nie działa.
kurtz
Hej
Cytat
jeszcze jedno zapytanie dotyczące daty

Tabela taka jak w przykładzie wyżej, tylko tym razem ma wyszukiwać rekordy z datą o 4 więcej niż data dzisiejsza.

oj nieladnie. mowiles ze zaintersujesz sie dokumentacja do mysql gdy idzie o operacje na datach i czasie.

na poczatku http://www.mysql.com/doc/en/Date_and_time_..._functions.html jest zapytanie bardzo podobne do tego co ty potrzebujesz. wstyd ;p

tobie prawdopodobnie jest potrzebne [sql:1:3fd634417e]SELECT * FROM tabela
WHERE TO_DAYS(NOW()) - TO_DAYS(data) > 4[/sql:1:3fd634417e]

A teraz komenatrz do poprzednich
Cytat
Zrobiłem takie zapytanie:
[sql:1:3fd634417e]
select * from tabela where data(NOW(), INTERVAL 4 DAY)
[/sql:1:3fd634417e]

próbowałem równeż

[sql:1:3fd634417e]
select * from tabela where data(NOW() + INTERVAL 4 DAY)
[/sql:1:3fd634417e]

ale rówenież nie działa.
data to nazwa kolumny. nie mozesz na niej dokonywac w ten spsoob operacji. zobacz na przyklady date_sub lub date_add w dokumentacji!

wynik powinnes rowniez do czegos porownac - inaczej zapytanie nie ma sensu.

Uwaga: proboj zbudowac dzialajce zapytanie bazujac na tych ktore sa w dokumentacji - twoje pomysly niestety nie sa nawet zgodne z normai jezyka - raczej wiec nie beda dzialac :


Pozdrawiam
maciu
Sorki Kurtz, ale jezcze nie do końca mi to działa (przeczytałem tą część manuala)

Jap wpisuje takie zapytanie
[sql:1:f1501fc5f9]
select * from tabela WHERE TO_DAYS(NOW()) - TO_DAYS(data) <=2
[/sql:1:f1501fc5f9]
to zwraca mi wyniki z przedziału 14-16 wrzesnia

Natomiast gdy zapytanie jest takie
[sql:1:f1501fc5f9]
select * from tabela WHERE TO_DAYS(NOW()) - TO_DAYS(data) >=2
[/sql:1:f1501fc5f9]
to powinno zwracać wynik z przedziału 16-18 września. Dobrze myśle?

A nie zwraca!!
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.