1

我想检索过去 24 小时与今天的日期相比的数据 - 1 天。

问题是我的表中没有日期时间字段,但日期分为 3 部分(日/月/年)

我试过这个:

select *
from user u
Where DAYOFMONTH (CURDATE () - INTERVAL 1 day) - u.Day <= 1
and MONTH (CURDATE ()) - = 0 u.Month
and YEAR (CURDATE ()) - = 0 u.Year

但如果我进入新的月份,它就不起作用。

你能帮我吗?

非常感谢

4

4 回答 4

2

我希望这个查询能解决它。希望 u.Month,u.Day,u.Year 一致。

select * from user u Where
STR_TO_DATE(CONCAT(u.Month,'-',u.Day,'-',u.Year), '%m-%d-%Y') = date_add(curdate() , INTERVAL -2 DAY)
于 2012-05-30T09:55:02.313 回答
2

使用 iso 格式,您可以使用 convert 来获取日期时间(tsql)

像这样的东西(未经测试)

SELECT * from user u 
where DATEADD(day,-1,GETDATE()) < convert(datetime, u.Year + u.Month + u.Day )
于 2012-05-30T09:52:42.553 回答
2

您可以从您的字段中格式化一个真实的日期DATE(CONCAT(u.Year, '-', u.Month, '-', u.Day)):然后您可以对其进行常规日期操作(例如减法INTERVAL 1 DAY

于 2012-05-30T09:47:04.513 回答
1

首先,这个计算的结果不会是精确的。您想“检索过去 24 小时的数据”,但您没有存储时间,只是存储日期。所以你只能从今天今天和昨天检索数据:

  • 仅提取今天的记录时:当您在 H00:00:01 提取数据时,可能会出现边界条件。由于您没有存储时间值,因此您将丢失昨天的数据,这很可能意味着所有数据
  • 在拉取今天和昨天的记录时:当您在 H23:59:59 拉取数据时,可能会出现边界条件。由于您不存储时间值,因此您将从 2 天(- 1 秒)中提取数据。

总之,将时间值添加到您的表中。最好是一列DATETIMETIMESTAMP数据类型(差异仅在范围内)。

回到你的问题。基本上,你想要做的是:

/*
select * from table
where date >= now - 1 day;
*/

如何计算now - 1 day?带DATE_SUB()功能:

DATE_SUB(NOW(), INTERVAL 1 DAY)

如何使您的列中的日期?具有CONCAT_WSSTR_TO_DATE()功能:

STR_TO_DATE(CONCAT_WS('-', u.Day, u.Month, u.Year, '00', '00', '00'), '%d-%m-%Y-%H-%i-%s')

连接的字符串中有零 - 只要将这些列添加到表中,您就可以将它们替换为u.Hour, 。但正如我之前所说,您将使用列实现最佳性能。u.Minu.SecDATETIME

总结:

SELECT *
FROM users u
WHERE STR_TO_DATE(CONCAT_WS('-', u.Day, u.Month, u.Year, '00', '00', '00'), '%d-%m-%Y-%H-%i-%s') >= DATE_SUB(NOW(), INTERVAL 1 DAY)
于 2012-05-30T10:56:05.410 回答