我有两张桌子,我正在加入。我想根据它是否是在24小时之前创建的结果来过滤结果。这是我的表格。
table user_infos (
id integer,
date_created timestamp with timezone,
name varchar(40)
);
table user_data (
id integer,
team_name varchar(40)
);
这是我用来将它们连接在一起并希望过滤它们的查询:
SELECT timestampdiff(HOUR, user_infos.date_created, now()) as hours_since,
user_data.id, user_data.team_name,
user_infos.name, user_infos.date_created
FROM user_data
JOIN user_infos
ON user_infos.id=user_data.id
WHERE timestampdiff(HOUR, user_infos.date_created, now()) < 24
ORDER BY name ASC, id ASC
LIMIT 50 OFFSET 0
我要做的是加入两个表,以便将id,team_name,name和date-created视为一个表。 然后我想过滤它,以便我只得到24小时前创建的结果。这就是我使用timestampdiff的原因。 然后我按名称和ID按升序排序。 然后将结果限制为50。
除了我不工作之外,一切都很好看。当我运行此查询时,它告诉我“小时”列不存在。
显然,这里有一些微妙的东西搞乱了一切。有没有人有任何建议?
或者,我试过这个,但它告诉我1处有语法错误;
SELECT
user_data.id, user_data.team_name,
user_infos.name, user_infos.date_created
FROM user_data
JOIN user_infos
ON user_infos.id=user_data.id
WHERE user_infos.date_created
BETWEEN DATE( DATE_SUB( NOW() , INTERVAL 1 DAY ) ) AND
DATE ( NOW() )
ORDER BY name ASC, id ASC
LIMIT 50 OFFSET 0
答案 0 :(得分:1)
我认为您的问题与您的数据类型有关。您正在检查时间戳字段是否在转换日期字段(从日期中删除时间)之间。 NOW()
与DATE(NOW())
不同。
所以你有两个选择。您可以删除DATE()
投射,它应该可以使用,或者您可以将date_created转换为日期。
SELECT
user_data.id, user_data.team_name,
user_infos.name, user_infos.date_created
FROM user_data
JOIN user_infos
ON user_infos.id=user_data.id
WHERE user_infos.date_created
BETWEEN DATE_SUB( NOW() , INTERVAL 1 DAY ) AND
NOW()
ORDER BY name ASC, id ASC
LIMIT 50 OFFSET 0