2 回答
TA贡献1785条经验 获得超4个赞
在我看来,这个问题的基本问题是您需要构建一个按日期排序的 mySQL 查询,但是您有两个问题:1)您的日期以一种奇特的格式存储,而不是真正的 mySQL 日期时间对象和 2)您的日期时区未标准化。幸运的是,mysql 提供了本地函数来解决这两个问题:
你的时区指标特别麻烦,因为它们的格式+HHMM
与全球标准相反+HH:MM
(用冒号分隔小时和分钟。所以我们必须使用SUBSTRING()
和的组合CONCAT()
将它们转换为可用的格式。
我同意该线程中的其他评论者的意见,他们建议如果这些数据以更有意义的数据/时间格式存储,这个问题会更容易,但我也知道有时你会陷入草率的数据,并学习如何清理/操作不完美的数据集是编程的一部分。考虑到这一点,我提出以下算法:
将日期字符串分成两部分:最后 5 个字符(时区)和其他所有字符(日期时间)。
将时区分成两个额外的块,由字符 3 和 4 之间的冒号分隔,因此
+1200
变为+12:00
.通过 STR_TO_DATE 函数传递日期时间块,将每个部分映射到相应的标记。这里的格式似乎是:
weekday_abbrev, 2_digit_month month_abrev 4_digit_year 24_base_2_digit_hour:2_digit_minute:2_digit_second
转换为 STR_TO_DATE 标记,此格式为:
'%a, %d %b %Y %H:%s:%i'
现在我们有了一个真实的日期时间对象和一个有意义的时区指示器。我们将这两个都传递给 CONVERT_TZ 以获得最终结果。
现在我们有一个为时区标准化的真实日期时间对象,按该字段排序,降序。
把它们放在一起,作为一个 mySQL 查询,它看起来像:
select
CONVERT_TZ(
STR_TO_DATE(
received_date,
'%a, %d %b %Y %H:%s:%i'
),
'+00:00',
CONCAT(SUBSTRING(received_date, -5, 3), ':', SUBSTRING(received_date, -2, 2))
) as dateTime
from inbox
order by dateTime desc
limit 10
原始数据:
查询结果:
TA贡献1880条经验 获得超4个赞
以这种方式创建mysql表(UTC时间,并以此值排序):
CREATE TABLE test_timestamp (
t1 TIMESTAMP
);
INSERT INTO test_timestamp(t1) VALUES('2019-01-01 23:11:01');
http://www.mysqltutorial.org/mysql-timestamp.aspx
- 2 回答
- 0 关注
- 155 浏览
添加回答
举报