将日期分类为 "yesterday"、"last week" 等
Classifying date as "yesterday", "last week", etc
我有一个 table 这样的:
// 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 |
+----+--------------+
问题是您没有根据第三个条件检查一周的范围。意义...
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 天前 ONLY。 25 号不是 22 号,所以它没有通过检查。您需要指定一个范围才能使其正常工作。
想必你想要的逻辑是这样的:
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
语句中的子句按顺序执行,因此第一个匹配的子句将 return 一个值。
- 如果您的原始代码失败,那么这也可能失败。您的原始代码不应该 returning 只有 "yesterday".
range
是保留字,需要转义
Here 是 SQL Fiddle.
我有一个 table 这样的:
// 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 |
+----+--------------+
问题是您没有根据第三个条件检查一周的范围。意义...
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 天前 ONLY。 25 号不是 22 号,所以它没有通过检查。您需要指定一个范围才能使其正常工作。
想必你想要的逻辑是这样的:
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
语句中的子句按顺序执行,因此第一个匹配的子句将 return 一个值。- 如果您的原始代码失败,那么这也可能失败。您的原始代码不应该 returning 只有 "yesterday".
range
是保留字,需要转义
Here 是 SQL Fiddle.