舍入时间戳列使其覆盖更长的时间段

时间:2017-07-24 04:55:31

标签: mysql sql sorting time

因此,当问题的标题解释时,我想围绕我的表的时间戳列向上(例如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排序执行时,5553155532创建的帖子将被视为相等(因为它们现在具有相同的值,将是他们都创建的粗糙的一天,而不是他们创建的第二天,然后排序得到喜欢,然后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)




如果您有任何疑问或希望我详细说明,请在评论中告知我,我很乐意回答,并感谢您抽出宝贵时间阅读我的问题:)

1 个答案:

答案 0 :(得分:1)

嗯,与此同时,这里需要考虑一下......

SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP()/86400)*86400) x;
+---------------------+
| x                   | 
+---------------------+
| 2017-07-24 01:00:00 |
+---------------------+