3

次の形式で日付を表示するクエリが必要です。

過去 7 日間の日付 -> 「1 週間前」 過去 7 ~ 14 日間の日付 -> 「2 週間前」 など…</p>

過去 30 日以内の日付 → 「1 か月前」 過去 30 ~ 60 日以内の日付 → 「2 か月前」 など

過去365日以内の日付→「1年前」 過去365日~730日以内の日付→「2年前」 など...

皆さんが私を正しい方向に向けることができれば、感謝します。

ありがとうございました

4

2 に答える 2

2

これが私が書いたtime_agoというmysql関数です

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

編集:

この回答を変更して、この関数の改善されたバージョンを提供しました。新しいバージョンでは、セッション変数を設定する代わりにDECLAREを使用します。

于 2013-03-16T19:59:49.523 に答える
1

前述のように、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 サーバー ブランドのドキュメントを参照してください)

于 2011-09-06T17:48:45.277 に答える