因此,当问题的标题解释时,我想围绕我的表的时间戳列向上(例如123456789
变为12345000
),以便我可以使用这些舍入的时间戳来排序基于插入日期(或至少接近一天)的表格行。
因此,在基于常规时间戳的排序中会发生什么,记录将根据插入的第二个进行排序(因为时间戳是基于秒的)。我想要发生的是,将那些常规时间戳压缩到覆盖天而不是一秒的那些时间戳,以便排序基于大于一秒的时间单位对我的记录进行排序(我希望它接近一个)天)。
这是一个示例表:
---------POSTS---------
ID TITLE TIME LIKES
1 "hello wor" 12345 12
2 "abcdef" 13345 32
3 "yes no" 55531 99921
4 "hello wor" 23345 25
5 "fghijklm" 55532 65
现在,考虑按TIME desc
对上表进行排序,在55532
创建的帖子先来,然后23345
,依此类推......但是,有一个问题,想象一下,我希望按TIME DESC, LIKES DESC
对表格进行排序,以便我从社区相对较新且受欢迎的帖子中获得一个很好的排名,在55532
创建的帖子只有{ {1}}喜欢会在65
创建的55531
喜欢的帖子之前出现,很明显,这是不一致的,因为第二个是微不足道的,应该无关紧要。因此,为了消除这种不一致性,我想找到一种方法将99921
列的值更改为涵盖更长时间段的值,而不仅仅是1秒,例如,如果我可以将它们转换为覆盖范围的单位然后,当TIME
排序执行时,55531
和55532
创建的帖子将被视为相等(因为它们现在具有相同的值,将是他们都创建的粗糙的一天,而不是他们创建的第二天,然后排序得到喜欢,然后TIME
,有55531
喜欢,将被排序首先,然后99921
,只有55532
喜欢。
创建一个包含创建帖子日期的新列不是一个选项,我必须使用我拥有的时间戳列。
到目前为止,我已经提出了两个可能的解决方案:
1-使用65
,然后使用ROUND(time, -5) as condensed_time
对行进行排序
2- Uglier解决方案,而非动态,condensed_time
。
这是我的查询的其余部分,以防你对整体情况感兴趣(我想使用缩短的时间,我正在谈论按日排序帖子(或20小时,或40,你得到的想法)他们被创建at):
case when (UNIX_TIMESTAMP() - time) < 86400 then 0 when (UNIX_TIMESTAMP() - time) < 259200 then 1 when (UNIX_TIMESTAMP() - time) < 604800 then 2 when (UNIX_TIMESTAMP() - time) < 864000 then 3 when (UNIX_TIMESTAMP() - time) < 1728000 then 4 when (UNIX_TIMESTAMP() - time) < 2592000 then 5 else 6 end)
如果您有任何疑问或希望我详细说明,请在评论中告知我,我很乐意回答,并感谢您抽出宝贵时间阅读我的问题:)
答案 0 :(得分:1)
嗯,与此同时,这里需要考虑一下......
SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP()/86400)*86400) x;
+---------------------+
| x |
+---------------------+
| 2017-07-24 01:00:00 |
+---------------------+