SELECT后无法获取行数据

时间:2018-08-10 20:01:36

标签: mysql sql

我对PHP和MySQL有点陌生,但遇到了一个问题(我什至不确定是否可行),这是我的问题:

我在这里有这张桌子:

Table

我使用以下语句:

SELECT *
FROM (SELECT DATE_FORMAT(STR_TO_DATE(SPLIT_STRING(`date`,' ',1), '%m/%d/%Y'), '%Y-%m-%d') as month
      FROM `automation-reports`
     ) as innerTable
WHERE MONTH(month) = 5 

哪个给我:

This

我希望能够从此处包含它的那一行获取success

This row

我不确定是否有可能考虑到现在返回该行的数据,但是就像我说的那样,我是MySQL的新手,所以我不确定局限性。

1 个答案:

答案 0 :(得分:1)

鉴于您的date列不是real DATETIME type,则需要使用STR_TO_DATE(),但可以使用更完整的日期字符串格式来返回完整的DATETIME立刻从所有对象。 correct format string'%m/%d/%Y %r',其中%r是12小时制hh:mm:ss,后跟AM/PM。使用该格式,您可以将整个输出包装在MONTH()SELECT中的WHERE中。

SELECT
  ID,
  reportid,
  report,
  success,
  STR_TO_DATE(date, '%m/%d/%Y %r') AS realdate
FROM
  `automation-reports`
-- Apply MONTH() in the HAVING
HAVING MONTH(realdate) = 5

或者,您可以将整个表达式放在HAVING之外,而不是WHERE

...
WHERE MONTH(STR_TO_DATE(date, '%m/%d/%Y %r') = 5)

但是,实际上,我建议将该列更改为适当的DATETIME,因为这样做将为您打开MySQL的所有日期处理功能,并允许RDBMS索引和优化该列。您不能真正地在适当位置更改该列,而不能让MySQL正确解析日期。相反,您需要添加一个新列,将其填充,然后删除旧列并重命名新列(除非您想同时保留两者)。

-- Add a DATETIME
ALTER TABLE `automation-reports` ADD realdate DATETIME;

-- And fill it with dates parsed from your string column
UPDATE `automation-reports` SET realdate = STR_TO_DATE(date, '%m/%d/%Y %r');

-- Drop the old column if you do not need both
ALTER TABLE `automation-reports` DROP date;

-- And rename the new one to the old name 
ALTER TABLE `automation-reports` CHANGE realdate date DATETIME;

在这种情况下,您可以在查询日期后设置日期的显示格式,这比将日期作为字符串以您要查询的格式存储为更好。

如果您现在可以重命名该表,我还建议您将表名从automation-reports更改为automation_reports,因为MySQL不需要在下划线名称旁加上引号,而您总是需要带连字符的反引号。