Mysql 选择后无法获取行数据
我对PHP和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 这给
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;