选择一列在另一列的一天内的行

时间:2014-08-05 15:56:03

标签: sql join

我有一个类似于SO的网站的两个表:一个有帖子,一个有每个帖子的上/下投票。我想选择在帖子被修改的那天投票的所有选票。

我的表格布局如下所示:

文章:

-----------------------------------------------
| post_id | post_author | modification_date   |
-----------------------------------------------
| 0       | David       | 2012-02-25 05:37:34 |
| 1       | David       | 2012-02-20 10:13:24 |
| 2       | Matt        | 2012-03-27 09:34:33 |
| 3       | Peter       | 2012-04-11 19:56:17 |
| ...     | ...         | ...                 |
-----------------------------------------------

投票(每次投票仅在当天结束时才算匿名):

-------------------------------------------
| vote_id | post_id | vote_date           |
-------------------------------------------
| 0       | 0       | 2012-01-13 00:00:00 |
| 1       | 0       | 2012-02-26 00:00:00 |
| 2       | 0       | 2012-02-26 00:00:00 |
| 3       | 0       | 2012-04-12 00:00:00 |
| 4       | 1       | 2012-02-21 00:00:00 |
| ...     | ...     | ...                 |
-------------------------------------------

我想要实现的目标

-----------------------------------
| post_id | post_author | vote_id |
-----------------------------------
| 0       | David       | 1       |
| 0       | David       | 2       |
| 1       | David       | 4       |
| ...     | ...         | ...     |
-----------------------------------

我已经能够编写以下内容,但它会在之前选择所有投票修改后的日期,而不是在同一天(因此,在此示例中为空表):< / p>

SELECT Posts.post_id, Posts.post_author, Votes.vote_id
FROM Posts
LEFT JOIN Votes ON Posts.post_id = Votes.post_id
WHERE CAST(Posts.modification_date AS DATE) = Votes.vote_date;

如何修复它以使WHERE子句在Votes.vote_date之前的一天?或者,如果不可能,还有另一种方式吗?

3 个答案:

答案 0 :(得分:1)

如果您的站点类似于Stack Overflow,那么您也可以使用SQL Server:

SELECT p.post_id, p.post_author, v.vote_id
FROM Posts p LEFT JOIN
     Votes v
     ON p.post_id = v.post_id
WHERE CAST(DATEDIFF(day, -1, p.modification_date) AS DATE) = v.vote_date;

不同的数据库有不同的方法减去一天。如果这不起作用,那么您的数据库就会有类似的东西。

答案 1 :(得分:1)

取决于您使用的数据库类型(SQL,Oracle等等);要获取前几天的投票,您通常可以从日期中减去1,它将减去1天:

Where Cast(Posts.modification_date - 1 as Date) = Votes.vote_date

或者如果modification_date已经是日期格式:

Where Posts.modification_date - 1 = Votes.vote_date

答案 2 :(得分:1)

我找到了另一个解决方案,即向Posts.modification_date添加一天:

...
WHERE CAST(CEILING(CAST(p.modification_date AS FLOAT)) AS datetime) = v.vote_date