Grzegorz Śledziński

Grzegorz Śledziński Programista
aplikacji
internetowych

Temat: [MySQL] Przedziały czasowe na pojedyncze daty...

Mamy tabele `tematy` składającą się z pól:

temat (varchar)
od (date)
do (date)

Czy jest jakieś zapytanie żeby dla krotki w postaci:

'jakiś temat','2010-11-10','2010-11-13'

uzyska rozczłonkowany przedział na poszczególne dni:

'jakis temat','2010-11-10'
'jakis temat','2010-11-11'
'jakis temat','2010-11-12'
'jakis temat','2010-11-13'Grzegorz Śledziński edytował(a) ten post dnia 10.11.10 o godzinie 11:50
Tomasz Zadora

Tomasz Zadora programuję

Temat: [MySQL] Przedziały czasowe na pojedyncze daty...

Ciekawe zadanie - ale obawiam się, że jednym zapytaniem SQL może to być nie do zrobienia. Być może przy użyciu jakiegoś LEFT JOINA byłoby to do zrobienia.

Możesz oczywiście użyć PHP (skoro już jesteśmy na grupie PHP) do pobrania danych wiersza/krotki a następnie podziału zakresu od - do na poszczególne dni i wygenerowania tablicy, tylko pewnie nie o to chodzi ? :)

Temat: [MySQL] Przedziały czasowe na pojedyncze daty...

a ja zapytam inaczej - jaki jest cel zabiegu?
Skoro chcesz rozbijać dane, to _być_może_ zamierzasz wiązać je z innymi, a wtedy może warto było by zmienić projekt samej bazy, która pozwali przechować te relację?

Wracając do tematu - nie znam sposobu jak dokonać tego 1 zapytaniem SQL, gdybyś miał do dyspozycji PL/SQL nie byłoby problemu.
W każdym razie ja, prosty człowiek ze wsi, widziałbym to na timestampach, ich inkrementacji i porównywaniu z górnym zakresem.
Grzegorz Śledziński

Grzegorz Śledziński Programista
aplikacji
internetowych

Temat: [MySQL] Przedziały czasowe na pojedyncze daty...

Szukałem, szukałem i nie znalazłem rozwiązania wprost... jednym jakie udało mi się znaleźć jest coś zbliżonego do propozycji Tomasza. Opiera się ono o stworzenie tabeli pomocniczej z wszystkimi datami z potrzebnego przedziału i wykorzystanie operacji JOIN. Poniżej kod procedur do aktualizacji takiej tabele - może się komuś przyda.

CREATE TABLE calendar (
`date` DATETIME,
KEY ( `date` )
);

DELIMITER $$

DROP PROCEDURE IF EXISTS `update_calendar` $$
CREATE PROCEDURE `update_calendar`( startdate DATETIME, enddate DATETIME )
BEGIN
DECLARE ctr INT DEFAULT 0;
DECLARE num INT;
SET num=DATEDIFF(enddate,startdate)+1;
TRUNCATE TABLE calendar;
WHILE ctr < num DO
BEGIN
INSERT INTO calendar VALUES ( DATE_ADD( startdate, INTERVAL ctr DAY) );
SET ctr = ctr + 1;
END;
END WHILE;
END $$

DELIMITER ;

Następna dyskusja:

Przedziały czasowe




Wyślij zaproszenie do