我需要过滤所有大于 2011 年 1 月 1 日的日期。
select * from table_name where date > '01/01/2011';
问题是date
字段存储int
值,这是一个示例:
1339011098
1336717439
1339010538
如何转换date
sql 查询中的字段(从int
格式到日期格式),我需要将其转换为有效日期,以便可以将其与上述日期进行比较。
谢谢。
你走错了方向。与其转换潜在的数百万条记录进行比较,不如尝试转换您的目标日期,您只需要做一次。这些看起来像 unix 时间戳,因此生成的查询应如下所示:
SELECT * FROM `Table_name` WHERE date > unix_timestamp('01/01/2011')
或者,如果您可以控制这一点,请尝试使用 ISO 日期格式,这样可以避免与 2013 年 3 月 2 日等日期的欧洲日期格式混淆:
SELECT * FROM `Table_name` WHERE date > unix_timestamp('2011-01-01')
您可以使用UNIX_TIMESTAMP()
select *
from table_name
where date > unix_timestamp('2011-01-01')
或者反过来使用FROM_UNIXTIME()
select *
from table_name
where FROM_UNIXTIME(date, "%Y-%m-%d") > '2011-01-01'
首先,您不应该将日期值存储为整数,如果它在您的控制之下,您的目标应该是修复数据库以及为该列插入整数值而不是日期的任何查询。
您需要在当前设置中使用的两个日期函数是UNIX_TIMESTAMP()
,它们接受日期值并返回纪元时间戳整数,FROM_UNIXTIME()
以及接受纪元时间戳整数并返回日期值。
对于您的示例,您可以使用:
SELECT * FROM table_name WHERE FROM_UNIXTIME(date_field) > '01/01/2011';
或者
SELECT * FROM table_name WHERE date_field > UNIX_TIMESTAMP('01/01/2011');
但我建议将FROM_UNIXTIME
其用作一般规则,因为这将简化更复杂的查询,例如:
SELECT * FROM table_name WHERE
FROM_UNIXTIME(date_field)
BETWEEN '01/01/2013' AND '04/01/2013';
本质上,在您的日期字段实际存储日期类型的值之前,您的查询应该使用FROM_UNIXTIME
.