将日期分类为"yesterday"、"last week"等



>我有这样的表格:

// mytable
+----+------------+
| id | date_time  |
+----+------------+
| 1  | 1464136759 | -- 5 days ago
| 2  | 1464436759 | -- 2 days ago
| 3  | 1464538248 | -- 6 hours ago
+----+------------+
--                     ^ these are based on current time which is 1464561158

我也有这个查询:

SELECT id, CASE DATE(FROM_UNIXTIME(date_time))
           WHEN CURDATE() THEN 'today' 
           WHEN CURDATE() - INTERVAL 1 DAY THEN 'yesterday'
           WHEN CURDATE() - INTERVAL 7 DAY THEN 'in last week'
           ELSE 'in last month or more'
           END range
FROM mytable
WHERE 1

这是电流输出:

+----+---------------+
| id |     range     |
+----+---------------+
| 1  | in last month |
| 2  | in last month |
| 3  | yesterday     |
+----+---------------+

正如你所看到的,我的问题选择了所有这些Unix时代错误。为什么以及如何修复它?

以下是预期输出:

+----+--------------+
| id |    range     |
+----+--------------+
| 1  | in last week |
| 2  | yesterday    | 
| 3  | today        |
+----+--------------+

大概,你想要的逻辑是这样的:

SELECT id,
       (CASE WHEN FROM_UNIXTIME(date_time) >= CURDATE() THEN 'today'
             WHEN FROM_UNIXTIME(date_time) >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) THEN 'yesteray'
             WHEN FROM_UNIXTIME(date_time) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) THEN 'in last week'
             ELSE 'in last month or more'
        END) as `range`
FROM mytable
WHERE 1;

笔记:

  • 没有理由提取日期。
  • case语句中的子句按顺序执行,因此第一个匹配的子句将返回一个值。
  • 如果原始代码失败,则也可能失败。 您的原始代码不应该只返回"昨天"。
  • range是一个保留字,因此需要对其进行转义。

这是SQL小提琴。

问题是你没有检查第三种情况的一周范围。意义。。。

DATE(FROM_UNIXTIME(date_time)) BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE() - INTERVAL 1 DAY

小提琴

目前,您的代码显示WHEN CURDATE() - INTERVAL 7 DAY THEN 'in last week'日期是否仅等于 7 天前。 25 日不是 22 日,因此它未通过该检查。您需要指定一个范围才能使其正常工作。

最新更新