Php 字符串上的范围查询

Php 字符串上的范围查询,php,mysql,Php,Mysql,我有一个MySQL表,其中一列以这种格式表示特定的时间戳:“yyyy-MM-dd-HH:MM:ss.SSS”该列的类型为string 如果我想在两个日期(“yyyy-MM-dd”)之间选择这些行,该怎么办?是否可以不将列类型更改为datetime?您可以使用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')

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


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

您可以使用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') ;
应该有效,因为“z”比任何数字都“大”。但使用起来会更“干净”

更新:

通常,如果您(例如)想要选择日期范围从
2016-10-01
2016-10-15
的任何时间戳,您的
start\u str
end\u 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'
end\u 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'
'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'


如果要搜索已定义的包含日期的结果,应将
中的
1
添加到
日期(结束日期)。

这是我通常用于时间戳和日期时间列的内容:

select *
from mytable
where ts >= '2016-10-01'
  and ts <  '2016-10-15' + interval 1 day
选择*
从mytable
其中ts>=“2016-10-01”
和ts<'2016-10-15'+间隔1天

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

如果列上有索引,则无法使用它。解析日期可能比仅仅进行字符串比较慢得多,但更大的问题是,这将错过最后一天的所有时间。您的结束时间是
2016-12-31 00:00:00
,因此
2016-12-31 15:00:00
将不包括在内。所以我只想将字符串日期传递给我的查询?@lorisstefano-希望更新将解决您的问题。另请看我的另一个答案,“z”是故意的还是打字错误?欢迎来到Stack Overflow!虽然这段代码片段可能会解决这个问题,包括如何以及为什么解决这个问题的解释,以提高您的文章的质量。记住,你是在将来回答读者的问题,而不仅仅是现在提问的人!请在回答中添加解释,并说明适用的限制和假设。
select * from tablename where columnname between '2016-10-01' and '2016-10-15 z'
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'
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'
select *
from tableName
where date between 'yyyy-MM-dd' and 'yyyy-MM-dd';
select *
from mytable
where ts >= '2016-10-01'
  and ts <  '2016-10-15' + interval 1 day
select * from tablename where columnname between '2016-10-01' and '2016-10-15 z'