Mysql 选择后无法获取行数据

Mysql 选择后无法获取行数据,mysql,sql,Mysql,Sql,我对PHP和MySQL都有点陌生,我有一个问题(我甚至不确定这是否可能),我的问题是: 我这里有一张桌子: 我用这句话: 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 这给

我对PHP和MySQL都有点陌生,我有一个问题(我甚至不确定这是否可能),我的问题是:

我这里有一张桌子:

我用这句话:

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 
这给了我:

我希望能够从包含它的行中获得
success


考虑到现在该行返回了数据,我不确定这是否可行,但正如我所说,我是MySQL新手,所以我不确定其局限性。

鉴于您的
date
列不是a,您需要使用
STR\u to\u date()
但您可以使用更完整的日期字符串格式一次从中返回完整的
DATETIME
对象。是
'%m/%d/%Y%r'
,其中
%r
是12小时的时间
hh:mm:ss
,后跟
AM/PM
。使用该格式,您可以在
SELECT
WHERE
中将整个输出包装在
MONTH()中

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
或者,您可以将整个表达式放在
中,而不是
中的
WHERE

...
WHERE MONTH(STR_TO_DATE(date, '%m/%d/%Y %r') = 5)
但实际上,我建议将该列更改为适当的
DATETIME
,因为这样做将为您打开MySQL的所有日期处理功能,并允许RDBMS对该列进行索引和优化。您无法在适当的位置更改列并让MySQL正确解析日期。相反,您需要添加一个新列,填充它,然后删除旧列并重命名新列(除非您想同时保留这两个列)

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


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

在FROM子句中,我看不出子查询的原因。您的
date
列是真正的
DATETIME
类型吗?如果是这样,我认为也不需要任何字符串操作,但这可能是一个非mysql日期格式的字符串。在任何情况下,您都可以使用
HAVING MONTH(MONTH)=5
来消除子查询,并轻松地在
SELECT
中包含任何其他列。您是否可以发布
SHOW CREATE TABLE“automation reports”的输出?如果这确实不是一个RealDateTime列,那么将其更改为RealDateTime列将使您受益匪浅。您不应该在数据库中存储HTML。保持数据清洁。当您决定更改设计或希望在其他地方使用数据时会发生什么情况?不,这不是实际的
date
列。这个表上的数据是从应用程序接收的,很遗憾,我需要将其格式化为这样。我也在想同样的事情。好的,我明白你说的关于使用
拥有
的意思了,你能给我举个例子说明它是什么样子吗?类似于<代码>选择*FROM(选择日期格式(STR_TO_DATE(分割字符串(
DATE
,'',1),'%m/%d/%Y'),'%Y-%m-%d')作为来自
automation reports`)的示例)作为具有月份的内表(示例)=5我想我理解您的意图,并将发布完整的答案…这是疯子,我对这些东西知之甚少,但我可以看到这些查询有多么强大。我是一个OOP(C#),所以把注意力转移到这方面就像骑自行车和摩托车一样。我知道基本的概念,但我可以学到很多。尽管如此,这是一个惊人的信息,超过了我的要求,而且是非常需要的。我要做你建议的改变。非常感谢你,伙计。
-- 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;