我需要一個以下列格式顯示日期的查詢:SQL查詢顯示「一個星期前」,「兩個星期前」,「一個月前」,「一年前」等「時間前的日期」等
日期落於過去7天 - >「一週前」落於過去的7〜14天 日期 - >「兩週前」 等...
日期落在過去30天 - >「一個月前」 過去30到60天的日期 - >「兩個月前 等..
個日期落於365日內 - >「一年前」 日期落在在過去365至730天 - >「兩年前 等...
如果你們能指點了正確的方向,我會感激。
謝謝
我需要一個以下列格式顯示日期的查詢:SQL查詢顯示「一個星期前」,「兩個星期前」,「一個月前」,「一年前」等「時間前的日期」等
日期落於過去7天 - >「一週前」落於過去的7〜14天 日期 - >「兩週前」 等...
日期落在過去30天 - >「一個月前」 過去30到60天的日期 - >「兩個月前 等..
個日期落於365日內 - >「一年前」 日期落在在過去365至730天 - >「兩年前 等...
如果你們能指點了正確的方向,我會感激。
謝謝
如上所述,在SQL查詢中使用case語句。事情是這樣的:
SELECT
Column1,
Column2,
theDate,
CASE
WHEN DATEDIFF(dd, theDate, GetDate()) =< 7 THEN 'One Week Ago'
WHEN DATEDIFF(dd, theDate, GetDate()) > 7 AND DATEDIFF(dd, theDate, GetDate()) < 30 THEN 'One Month Ago'
-- ...
END
AS TimeAgo,
Column3,
Column4
FROM Table1
對MS SQL的詳細信息:http://msdn.microsoft.com/en-us/library/ms181765.aspx (或查看您的SQL服務器品牌的文檔)
這裏是一個MySQL的函數我編寫的名爲TIME_AGO
DELIMITER $$
DROP FUNCTION IF EXISTS time_ago;
CREATE FUNCTION time_ago (ts datetime)
RETURNS varchar(255)
DETERMINISTIC
BEGIN
DECLARE utx INT SIGNED DEFAULT 1;
DECLARE nowutx INT SIGNED DEFAULT 1;
DECLARE dif INT SIGNED DEFAULT 1;
DECLARE method varchar(255);
DECLARE cnt varchar(255);
DECLARE plural tinyint(11);
DECLARE future tinyint(11);
SET utx := UNIX_TIMESTAMP(ts);
SET nowutx := UNIX_TIMESTAMP(NOW());
SET future := utx > nowutx;
SET dif := IF(future, utx - nowutx, nowutx - utx);
SET method := IF(dif < 60, 'Second', IF(
dif < (60 * 60), 'Minute', IF(
dif < (60 * 60 * 24), 'Hour', IF(
dif < (60 * 60 * 24 * 7), 'Day' , IF(
dif < (60 * 60 * 24 * 365), 'Week', 'Year')))));
SET cnt := IF(dif < 60, dif, IF(
dif < (60 * 60), floor(dif/60), IF(
dif < (60 * 60 * 24), floor(dif/(60 * 60)), IF(
dif < (60 * 60 * 24 * 7), floor(dif/(60 * 60 * 24)) , IF(
dif < (60 * 60 * 24 * 365) , floor(dif/(60 * 60 * 24 * 7)), floor(dif/(60 * 60 * 24 * 365)))))));
SET plural := cnt != 1;
return CONCAT(IF(future, 'In ', ''), cnt, ' ',method, IF(plural, 's', '') , IF(future, ' From Now', ' Ago'));
END$$
DELIMITER ;
它是這樣使用的
SELECT time_ago(date_ordered) time_ago FROM orders LIMIT 1
和結果如下:
time_ago
22 Weeks Ago
編輯:
我已經修改了這個答案提供此功能的改進版本:新版本使用的申報,而不是設置會話變量。
您可以使用像HeidiSQL這樣的程序來定義它。它不容易完成標準的PHP mysql函數。 –
很棒的功能!完美的作品 - 我唯一改變的就是大寫字母,意思是把它們摘下來,但非常棒! –
很高興你可以使用它! –
您**可以**使用'case'語句...但是,RDBMS不是讓您的數據看起來漂亮的工具。 – 2011-09-06 17:41:34
SQL只有一個數據結構:表。所以把你的數據放在一張表中,例如'days_from','days_to'和'敘述'的列(屬性),然後在查詢中對該表加入「JOIN」。 '... ON m.my_interval_days BETWEEN d.days_from AND d.days_to ...' – onedaywhen
您正在使用哪種rdbms? MySQL的?甲骨文? SQL服務器? –