按日期过滤数据?

时间:2015-08-23 05:43:06

标签: php mysql mysqli

column包含类似数据,

07/2002
05/2005
04/2000

month/year

我可以使用查询过滤掉数据,即

SELECT * FROM `table` WHERE `fr` < '07/2002'

它应该返回04/2000

是否可以使用MySQL或我使用其他语言来选择和过滤掉PHP等数据?

2 个答案:

答案 0 :(得分:2)

<强>计划

  
      
  • 使用str_to_date   将月份值的开头转换为日期并进行比较
  •   

<强>查询

select *
from `table`
where str_to_date(concat('01/', fr), '%d/%m/%Y') 
      < 
      str_to_date('01/07/2002', '%d/%m/%Y')
;

<强>输出

+---------+
| fr      |
+---------+
| 04/2000 |
+---------+

sqlfiddle

注意

虽然以上是问题的解决方案,但它只是处理症状而不是根本问题。

真正的问题是用于存储日期信息的存储类型 考虑使用实际日期来存储此信息。这会导致以下症状:

<强>症状

  
      
  • 复杂性:我们必须执行进一步的操作以转换为我们可以使用的日期类型
  •   
  • 表现(见上文)
  •   
  • 维护(see this question
  •   

我们可以通过更改存储类型以正确反映语义内容(其日期信息并且应该能够以这种方式进行简单比较)来解决此问题。

<强>修复

alter table `table` add column fr_datetype date not null;

update `table`
set fr_datetype = str_to_date(concat('01/', fr), '%d/%m/%Y')
;

-- test conversion to date type
select 
'error converting' as test_conversion
from `table`
where concat(lpad(extract(month from fr_datetype), 2, '0'), '/', extract(year from fr_datetype)) <> fr
;

-- only finalise this based on successful completion of above select ( no rows returned )
alter table `table` drop column fr;
alter table `table` change column fr_datetype fr date not null;

简化解决方案

select *
from `table`
where fr < '2002-07-01'
;

答案 1 :(得分:0)

使用MySQL内置的日期格式,因此您可以执行以下查询:

WHERE DATE_FORMAT(date_field, '%m') < 7
AND DATE_FORMAT(date_field, '%y') < 2002

或者更简单的解决方案是使用时间戳(存储秒数),您可以执行以下操作:

WHERE timestamp_field < 1027407492

或者,如果您现在正在使用日期(不推荐),请将它们存储在两列中。一个月和一个月,然后您可以这样查询:

WHERE month_field < 7
AND WHERE year_field < 2002

我推荐时间戳。