2016-10-15 166 views
1

我有一个MySQL表,其中列表示在这种格式的特定时间戳:“YYYY-MM-DD HH:MM:SS.SSS”类型的列的是范围查询

如果我想选择两个日期之间的那些行(“yyyy-MM-dd”),该怎么办?是否有可能不更改列日期时间的列类型?

回答

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,您将过滤掉当天的任何时间戳。

Additionaly - 如果你使用的follwing条件之一

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' 
+0

添加格式,所以我只是要传递字符串日期到我的查询? –

+0

@lorisstefano - 希望更新不会影响您的问题。另请参阅我的其他答案。 –

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') ; 
+0

如果列上有一个索引,这将无法使用它。解析日期可能比仅仅进行字符串比较慢得多。 – Barmar

+0

但是更大的问题是,这将在最后一天错过所有的时间。你的结束时间是'2016-12-31 00:00:00',所以'2016-12-31 15:00:00'将不会包含在内。 – Barmar

+0

@Barmar感谢与时间 – scaisEdge

0

使用

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

如果你要搜索定义的结果包括日期,你应该在to添加1日期(结束日期)。

0

这就是我通常使用TIMESTAMP和DATETIME列:

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

这也将与字符串列工作,aslong你存储在正确的格式的时间戳。

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

是“z”意图还是打字错误? – Sliq

+1

欢迎来到Stack Overflow!尽管这段代码可能会解决这个问题,其中包括* how *和* why *的解释,这可以解决问题[真的有所帮助](// meta.stackexchange.com/q/114762)来提高帖子的质量。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 –