在一个查询中,MySQL修剪和字符串到目前为止

时间:2012-02-23 20:12:04

标签: mysql sql function

我正在尝试根据日期搜索一些vchar值。

我必须使用的字符串如下所示:

1/7/2006 12:45:24 AM

1/7/2006 1:18:36 AM

1/7/2006 1:21:43 AM

1/7/2006 1:32:09 AM

3/30/2006 12:32:10 PM

3/30/2006 1:19:30 PM

3/30/2006 1:20:44 PM

所以首先让我们摆脱AM .. PHPMyAdmin sql查询是:

 SELECT  trim('AM'  FROM  `orderdate`) FROM tblorders

这样可以摆脱AM现在让我们将值设置为变量并尝试将字符串包装到结果周围的str_to_date():

SELECT  trim('AM'  FROM  `orderdate`) AS `value`, STR_TO_DATE(`value`,'%d,%m,%Y') FROM tblorders

这会产生一个未知列的值。如何将两个函数值串在一起,然后使用它们进行过滤,例如WHERE值> 2006年2月1日?

1 个答案:

答案 0 :(得分:1)

你可以编写这样的函数:

select str_to_date(trim('AM' from orderdate), '%m/%d/%Y')

请注意,我还更正了您的日期格式以匹配您的数据。您实际上不需要修剪这些值以对它们使用str_to_date,这样可以正常工作:

select str_to_date(orderdate, '%m/%d/%Y')

如果要在WHERE子句中使用它,那么将函数调用放在那里:

select trim('AM' from orderdate), str_to_date(orderdate, '%m/%d/%Y')
from your_table
where str_to_date(orderdate, '%m/%d/%Y') > '2006-01-02'

让优化器识别重复或使用派生表:

select value, the_date
from (
    select trim('AM' from orderdate) as value, str_to_date(orderdate, '%m/%d/%Y') as the_date
    from your_table
) dt
where the_date > '2006-01-02'

请注意在查询中使用ISO 8601日期,该格式是明确的,任何值得使用的数据库都会理解它,无论您的语言环境设置如何。

我还建议您修复架构以使用实时时间戳而不是那些字符串。