该查询有效,但我想知道是否可以缩短查询时间

时间:2019-07-30 03:58:22

标签: php mysql sql

我正在尝试从字符串字段中提取最后一个单词...如果它是month的名称,我想将其转换为Number中的month。它正在工作,但是太长了。我们是否可以包含“日期时间值不正确”或日期格式错误,然后显示空白?

如果那样的话,效果不好...

case 
when (SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)) = "January" then (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M')))
when (SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)) = "February" then (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M')))
when (SUBSTRING_INDEX(tbl_StringsList.items, " ", -1))= "March" then (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M')))
when (SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)) = "April" then (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M')))
when (SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)) = "May" then (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M')))
when (SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)) = "June" then (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M')))
when (SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)) = "July" then (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M')))
when (SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)) = "August" then (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M')))
when (SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)) = "September" then (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M')))
when (SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)) = "October" then (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M')))
when (SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)) = "November" then (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M')))
when (SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)) = "December" then (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M')))
else null
end  as `Last_NuM_Month`

此示例正在运行,但时间过长。

2 个答案:

答案 0 :(得分:1)

实际上,您可以将代码减少到下面的行:

SELECT (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M'))) AS `Last_NuM_Month`;

如果NULL中的月份名称无效,例如“ februember”,则MySQL的MONTH()将返回tbl_StringsList.items

答案 1 :(得分:0)

您可以更改为此:

CASE 
    WHEN (SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)) IN 
    (
        'January', 'February', 'March', 'April', 'May', 'June', 
        'July', 'August', 'September', 'October', 'November', 'December'
    )
    THEN (MONTH(str_to_date((SUBSTRING_INDEX(tbl_StringsList.items, " ", -1)),'%M')))
    ELSE NULL
END AS `Last_NuM_Month`

经过rextester

的测试