我对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的新手,所以我不确定局限性。
答案 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不需要在下划线名称旁加上引号,而您总是需要带连字符的反引号。