我column
包含类似数据,
07/2002
05/2005
04/2000
month/year
我可以使用查询过滤掉数据,即
SELECT * FROM `table` WHERE `fr` < '07/2002'
它应该返回04/2000
是否可以使用MySQL
或我使用其他语言来选择和过滤掉PHP
等数据?
答案 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 |
+---------+
注意强>
虽然以上是问题的解决方案,但它只是处理症状而不是根本问题。
真正的问题是用于存储日期信息的存储类型 考虑使用实际日期来存储此信息。这会导致以下症状:
<强>症状强>
- 复杂性:我们必须执行进一步的操作以转换为我们可以使用的日期类型
- 表现(见上文)
- 维护(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
我推荐时间戳。