显示 "time ago dates"的 SQL 查询,例如 “one week ago”、 “two weeks ago”、 “one month ago”、 “one year ago” 等

标签 sql time date timeago formatdatetime

我需要一个以下列格式显示日期的查询:

过去 7 天内的日期 -> “一周前” 过去 7 到 14 天内的日期 -> “两周前” 等等……

过去 30 天内的日期 -> “一个月前” 过去 30 到 60 天之后的日期 -> “两个月前 等等。

过去 365 天内的日期 -> “一年前” 过去 365 到 730 天内的日期 -> “两年前 等等……

如果你们能指出正确的方向,我将不胜感激。

谢谢

最佳答案

这是我写的一个名为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 而不是设置 session 变量。

关于显示 "time ago dates"的 SQL 查询,例如 “one week ago”、 “two weeks ago”、 “one month ago”、 “one year ago” 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7323883/

相关文章:

MySQL GROUP_CONCAT 使用子查询

algorithm - 你如何编写一个 cronjob 在中午 12 点和中午 12 点之后只运行一次

JavaScript - 日期不相等

mysql - 如何在模型中存储日期?

excel - 如何将字符串 (YYYY.MM) 转换为 excel 可以理解的日期格式 (MM/YYYY) 以用于绘图目的?

sql - 将 select 方法与第一个方法组合返回错误 rails 4

sql - 我应该将贷款、采购和销售表非规范化为一张表吗?

php - SQL 通过条件连接其他表

linux - Bash变量扩展不能与时间命令结合使用

java - 系统时间代表什么?