对字符串的范围查询

时间:2016-10-15 14:27:40

标签: php mysql

我有一个MySQL表,其中一列表示此格式的特定时间戳:“yyyy-MM-dd HH:mm:ss.SSS”列的类型为 string

如果我想在两个日期之间选择那些行(“yyyy-MM-dd”)怎么办?是否可以不将列类型更改为datetime?

5 个答案:

答案 0 :(得分:1)

select *
from mytable
where ts between '2016-10-01' and '2016-10-15 z'

应该有效,因为'z'比任何数字都“更大”。但使用

会更“干净”
where ts between '2016-10-01 00:00:00.000' and '2016-10-15 23:59:59.999'

<强>更新

一般情况下,如果您(例如)想要选择从2016-10-012016-10-15的日期范围内的任何时间戳,则您的start_strend_str必须符合以下条件规则:

'2016-09-30 23:59:59.999' <  start_str <= '2016-10-01 00:00:00.000'
'2016-10-15 23:59:59.999' <= end_str   <  '2016-10-16 00:00:00.000'

start_str的一些可能值:

'2016-10-01'
'2016-10-01 00:00:00'
'2016-10-01 00:00:00.000'
'2016-09-30 24'
'2016-09-30 3'

end_str的一些可能值:

'2016-10-15 23:59:59.999'
'2016-10-15 23:59:59.999999'
'2016-10-15 24'
'2016-10-15 3'
'2016-10-15 a'
'2016-10-15 z'
'2016-10-16'

要在评论中回答您的问题:您可以传递开始日期的字符串表示形式,但不能使用结束日期。在字符串比较方面,2016-10-15小于2016-10-15 23:59:59.999因此会破坏规则'2016-10-15 23:59:59.999' <= end_str,您可以过滤掉当天的任何时间戳。

另外 - 如果您使用以下某个条件

where ts between '2016-10-01' and '2016-10-15 23:59:59.999999'

where ts between '2016-10-01 00:00:00' and '2016-10-15 23:59:59.999999'

您可以稍后将数据类型更改为TIMESTAMP(3)TIMESTAMP(6),您的查询仍然有效。

如果您的日期范围来自其他某个表,则需要连接

select *
from timestamps t
join dateranges r
  on t.ts between r.start_date and concat(r.end_date, '23:59:59.999999')
where r.some_column = 'some_value'

答案 1 :(得分:0)

你可以使用str_to_date格式为yyy-MM-dd HH:mm:ss.SSS

select * from my_table  
where   str_to_date(my_column, '%Y-%m-%d %h:%i:%s.$f') 
            between str_to_date('01-01-2016 00:00:00' , '%d-%m-%Y HH:mm:ss') 
                 and str_to_date('31-12-2016 23:59:59' , '%d-%m-%Y HH:mm:ss') ;

答案 2 :(得分:0)

使用

select *
from tableName
where date between 'yyyy-MM-dd' and 'yyyy-MM-dd';

如果您想要搜索定义的结果包含日期,则应在1日期(结束日期)中添加to

答案 3 :(得分:0)

这是我通常用于TIMESTAMP和DATETIME列的内容:

select *
from mytable
where ts >= '2016-10-01'
  and ts <  '2016-10-15' + interval 1 day

这也适用于字符串列,只要您以正确的格式存储时间戳。

答案 4 :(得分:0)

select * from tablename where columnname between '2016-10-01' and '2016-10-15 z'