Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 舍入时间戳列,使其覆盖更大的时间段_Mysql_Sql_Sorting_Time - Fatal编程技术网

Mysql 舍入时间戳列,使其覆盖更大的时间段

Mysql 舍入时间戳列,使其覆盖更大的时间段,mysql,sql,sorting,time,Mysql,Sql,Sorting,Time,因此,正如问题的标题所解释的,我想将表的时间戳列向上舍入(例如,123456789变为12345000),以便我可以使用这些舍入的时间戳根据插入的日期(或至少接近一天)对表中的行进行排序 因此,在基于常规时间戳的排序中,将根据插入的第二个时间戳对记录进行排序(因为时间戳是基于第二个时间戳的)。我想做的是,将这些常规时间戳压缩为几天而不是一秒钟,这样排序就可以根据大于一秒的时间单位(我希望它接近一天)对我的记录进行排序。 下面是一个示例表: ---------POSTS--------- I

因此,正如问题的标题所解释的,我想将表的时间戳列向上舍入(例如,
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

现在,考虑通过<代码>时间DISC/<代码>对上述表进行排序,在<代码> 55532或<代码>中创建的帖子将先出现,然后<代码> 23345 < /代码>,等等…但是,有一个问题,假设我想按

TIME DESC,LIKES DESC>对表格进行排序,这样我就可以从那些相对较新且深受社区欢迎的帖子中获得一个不错的排名,在
55532
创建的帖子只有
65
个喜欢,而在
55531
创建的帖子有
99921个喜欢,显然,这是不一致的,因为第二个是无关紧要的。为了消除这种不一致性,我想找到一种方法,将
TIME
列的值更改为覆盖更长时间段的值,而不是仅1秒,例如,如果我可以将它们转换为覆盖一天而不是一秒的单位,那么,当我的
时间
排序执行时,在
55531
55532
创建的两个帖子将被视为相等的(因为它们现在将具有相同的值,这将是它们创建时的大致日期,而不是创建时的第二天),然后排序得到类似的结果,然后
55531
,有
99921
likes的将首先被排序,然后是
55532
,它只有
65
likes。

创建包含帖子创建日期的新列不是一个选项,我必须使用我拥有的时间戳列。


到目前为止,我提出了两种可能的解决方案:

1-使用
四舍五入(time,-5)作为压缩时间
,然后使用
压缩时间
对行进行排序。

2-更丑陋的解决方案,不是动态的,
当(UNIX_TIMESTAMP()-time)<86400时为0当(UNIX_TIMESTAMP()-time)<259200时为1当(UNIX_TIMESTAMP()-time)<604800时为2当(UNIX_TIMESTAMP()-time)<864000时为3当(UNIX_TIMESTAMP()-time)<1728000时为4当(UNIX_TIMESTAMP()-time)<2592000然后5或6结束)



如果您对全局感兴趣,下面是我的问题的其余部分(我想使用我所说的压缩时间,按创建的日期(或者20小时,或者40小时,您可以理解)对帖子进行排序):





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

好吧,同时,这里有一些事情需要考虑

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

见@草莓谢谢!我编辑了我的问题。如果我还有其他改进,请通知我。@Taurus您是否必须在数据库中的SQL/中执行舍入?或者你可以通过编程的方式来实现,即在将数据插入表之前对其进行操作吗?@ViktorSeifert如问题中所述,除了使用我拥有的SQL
time
列之外,我别无选择。还有更多的改进吗?链接接受的答案非常具体!
SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP()/86400)*86400) x;
+---------------------+
| x                   | 
+---------------------+
| 2017-07-24 01:00:00 |
+---------------------+