我有一个MySQL表,其中一列表示此格式的特定时间戳:“yyyy-MM-dd HH:mm:ss.SSS”列的类型为 string
如果我想在两个日期之间选择那些行(“yyyy-MM-dd”)怎么办?是否可以不将列类型更改为datetime?
答案 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-01
到2016-10-15
的日期范围内的任何时间戳,则您的start_str
和end_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'