To zapytanie wyświetli dokładne dni, godziny, minuty i sekundy od północy 1 lutego 2011 r.:
SELECT
TRIM(REPLACE(CONCAT(
IF(dy=0,'',IF(dy=1,'1 day ',CONCAT(dy,' days '))),
IF(hr=0,'',IF(hr=1,'1 hr ', CONCAT(hr,' hrs '))),
IF(mn=0,'',IF(mn=1,'1 min ',CONCAT(mn,' mins '))),
IF(sc=0,'',IF(sc=1,'1 sec ',CONCAT(sc,' secs ')))),' ',' '))
TimeDisplay
FROM (SELECT dy,hr,mn,MOD(sec_aaaa,60) sc
FROM (SELECT dy,hr,FLOOR((sec_aaa - dy*86400 - hr*3600)/60) mn,sec_aaa sec_aaaa
FROM (SELECT dy,FLOOR((sec_aa - (dy*86400))/3600) hr,sec_aa sec_aaa
FROM (SELECT FLOOR(sec_a/86400) dy,sec_a sec_aa
FROM (SELECT (UNIX_TIMESTAMP() - UNIX_TIMESTAMP('2011-02-01 00:00:00')) sec_a)
A) AA) AAA) AAAA) B;
Wystarczy zastąpić '2011-02-01 00:00:00'
z dowolną wartością daty i godziny lub nazwą kolumny tabeli.
Spróbuj !!!
AKTUALIZACJA 06.10.2011 13:38 EDT
Napisałem zapisaną funkcję, którą możesz wywołać, która obsłuży to za Ciebie:
DELIMITER $$
DROP FUNCTION IF EXISTS `test`.`GetTimeDisplay` $$
CREATE FUNCTION `test`.`GetTimeDisplay` (GivenTimestamp TIMESTAMP)
RETURNS VARCHAR(32)
DETERMINISTIC
BEGIN
DECLARE rv VARCHAR(32);
DECLARE diff BIGINT;
SET diff = UNIX_TIMESTAMP() - UNIX_TIMESTAMP(GivenTimestamp);
SELECT
TRIM(REPLACE(CONCAT(
IF(dy=0,'',IF(dy=1,'1 day ',CONCAT(dy,' days '))),
IF(hr=0,'',IF(hr=1,'1 hr ', CONCAT(hr,' hrs '))),
IF(mn=0,'',IF(mn=1,'1 min ',CONCAT(mn,' mins '))),
IF(sc=0,'',IF(sc=1,'1 sec ',CONCAT(sc,' secs ')))),' ',' '))
INTO rv
FROM (SELECT dy,hr,mn,MOD(sec_aaaa,60) sc
FROM (SELECT dy,hr,FLOOR((sec_aaa - dy*86400 - hr*3600)/60) mn,sec_aaa sec_aaaa
FROM (SELECT dy,FLOOR((sec_aa - (dy*86400))/3600) hr,sec_aa sec_aaa
FROM (SELECT FLOOR(sec_a/86400) dy,sec_a sec_aa
FROM (SELECT ABS(UNIX_TIMESTAMP() - UNIX_TIMESTAMP(GivenTimestamp)) sec_a)
A) AA) AAA) AAAA) B;
IF diff = 0 THEN
SET rv = '0 secs';
END IF;
IF diff < 0 THEN
SET rv = CONCAT(rv,' From Now');
END IF;
IF diff > 0 THEN
SET rv = CONCAT(rv,' Ago');
END IF;
RETURN rv;
END $$
DELIMITER ;
Możesz przepisać zapytanie w ten sposób:
$query = "select country, rprice as regPrice, mprice as midPrice, pprice as prePrice, saddress as streetAddress,
_id as ID, lat, lng, sname as Name, logo, admin_level_1 as state, locale as city, test.GetTimeDisplay(rdate) as regDate,
test.GetTimeDisplay(mdate) as midDate, test.GetTimeDisplay(pdate) as preDate,
format((acos(sin(radians($lat1)) * sin(radians(lat)) + cos(radians($lat1)) *
cos(radians(lat)) * cos(radians($lng1) - radians(lng))) * 6378),1) as distance from stationDetails where
(acos(sin(radians($lat1)) * sin(radians(lat)) + cos(radians($lat1)) * cos(radians(lat)) *
cos(radians($lng1) - radians(lng))) * 6378) <= $rad order by $sort asc, $type asc";
Możesz przenieść zapisaną funkcję do innej bazy danych. Kod, który mam, umieszcza zapisaną funkcję w testowej bazie danych.
Spróbuj !!!