0

我有一个名为“reportinc”的表,我必须在其中提取 - 它是 VARCHAR 字段 - 从 18:01 (时间格式为 %H:%i)到今天 18:00 过去的 1 天或几天。

我试过这个查询

SELECT `ID incidente`, `Data/ora apertura`
FROM `reportinc`
WHERE `Data/ora apertura` 
BETWEEN 
(   
SELECT date_format( now( ) - INTERVAL 1
DAY , "%d/%m/%y at 18:01 " )
)
AND 
(
SELECT date_format( now( ) , "%d/%m/%y at 18:00 " )

我想从昨天18:01提取到今天18:00。但结果是从昨天到今天的 00:00。它不将 18:00 或 18_01 视为有效时间格式。如何指定查询时间?

再次感谢

4

3 回答 3

1

Data/ora apertura 字段必须是 DATETIME 字段,否则您必须进行 CAST。

然后你必须这样做:

SELECT `ID incidente`, `Data/ora apertura`
FROM `reportinc`
WHERE `Data/ora apertura` 
BETWEEN 
(   
    SELECT date_format( now( ) - INTERVAL 1 DAY , "%Y-%m-%d 18:01:00" )
)
AND 
(
    SELECT date_format( now( ) , "%Y-%m-%d 18:00:00" 
)

当字段类型为 VARCHAR 时,Between 不会按预期工作。

于 2013-01-22T13:56:59.490 回答
0

首先将格式从 varchar 更改为有效的日期格式。varchar 将值作为字符串,您将不得不使用正则表达式来分叉日期和时间。最好选择前一个选项。

于 2013-01-22T13:56:27.800 回答
0

编辑添加了更具体的日期时间格式

我在时间和日期的组合中遇到了同样的问题。时间被忽略,因此您会得到一整天的结果。

尝试 PHP 或其他编程语言来操作 MySQL。或者按照我的建议尝试更改 CSV 文件的导入方法。

SELECT *,CAST((STR_TO_DATE(`Data/ora apertura`, '%d/%m/%Y %H.%i')) AS DATETIME) 
AS DATE_TIME 
FROM reportinc
WHERE (CAST((STR_TO_DATE(`Data/ora apertura`, '%d/%m/%Y %H.%i')) AS DATETIME))  >= ('2012-22-01 21:00');

SELECT *,CAST((STR_TO_DATE(`Data/ora apertura`, '%d/%m/%Y %H.%i')) AS DATETIME) 
AS DATE_TIME 
FROM reportinc
WHERE (STR_TO_DATE(`Data/ora apertura`, '%d/%m/%Y %H.%i'))  >= ('2012-22-01 21:00');

样本数据:

CREATE TABLE reportinc (
  `ID_incidente` int auto_increment primary key,
  `Data/ora apertura` varchar(30)
  );


INSERT INTO reportinc (`Data/ora apertura`) 
VALUES 
("31/07/2012 10.46"),
("31/07/2012 10.47"),
("22/01/2013 20.00"),
("23/01/2013 10.00");

SQL FIDDLE 演示 ---

尝试类似:

使用强制转换功能:

SELECT * FROM reportinc WHERE (CAST(`Data/ora apertura` AS DATETIME)) >= NOW() - INTERVAL 3 hour;

使用 str_to_date 函数:

   SELECT * FROM reportinc WHERE (STR_TO_DATE(`Data/ora apertura`,'%Y-%m-%d %H:%i:%s')) >= NOW() - INTERVAL 3 hour;

您对时间范围有点不清楚,所以我以 3 小时为例。您还可以使用特定的日期和时间。

使用演员表:

`SELECT * FROM reportinc WHERE (CAST(`Data/ora apertura` AS DATETIME)) >= ('2013-01-22 20:00:00');`

使用 str_to_date

SELECT  * FROM reportinc WHERE (STR_TO_DATE(apertura, '%Y-%m-%d %H:%i:%s'))  >= ('2013-01-21 20:00:00');

样本数据:

CREATE TABLE reportinc (
  `ID_incidente` int auto_increment primary key,
  `Data/ora apertura` varchar(30),
  `Data/ora apertura1` datetime
  );


INSERT INTO reportinc ( `Data/ora apertura`, `Data/ora apertura1`) 
VALUES (NOW() - INTERVAL 1 day, NOW() - INTERVAL 1 day),
(NOW() - INTERVAL 1 hour, NOW() - INTERVAL 1 hour),
(NOW() - INTERVAL 3 hour, NOW() - INTERVAL 3 hour),
(NOW() - INTERVAL 6 hour, NOW() - INTERVAL 6 hour),
(NOW() - INTERVAL 9 hour, NOW() - INTERVAL 9 hour),
(NOW() - INTERVAL 1 year, NOW() - INTERVAL 1 year);

SQL 小提琴演示

顺便说一句,我的建议是停止在列名和表名中使用斜杠、空格等。

如果您接受对您有帮助的答案,我将不胜感激。

于 2013-01-22T17:54:13.470 回答