2016-12-30 180 views
0

我想从数据库中仅返回添加“今年”(当前年份)的行。每行的创建日期作为时间戳存储在十进制格式中。比较当前的时间戳与mysql存储的时间戳

我想象的一种方法是获取当前年份的时间戳范围,然后选择适合此范围的行。我有谷歌它,但没有成功。 有没有办法将给定年份与该数据库存储的时间戳进行比较?

+3

更新您的问题并显示您的样本数据和您的表架构 – scaisEdge

+0

什么是创建日期数据格式?字符串或时间戳? – reza

+0

它只是一个存储为十进制类型的时间戳 - 十进制(50,0) – user348078

回答

1

通常的模式是你描述...裸列比较的范围。

我们可以使用表达式来导出范围的开始和结束。在这种情况下,年初和明年年初。

编辑

如果creation_date列的数据类型为DATE,DATETIME,或TIMESTAMP格式,那么,作为一个例子:

WHERE t.creation_date >= DATE_FORMAT(NOW(),'%Y-01-01') + INTERVAL 0 MONTH 
    AND t.creation_date < DATE_FORMAT(NOW(),'%Y-01-01') + INTERVAL 12 MONTH 

我们可以测试使用SELECT语句表达

SELECT DATE_FORMAT(NOW(),'%Y-01-01') + INTERVAL 0 MONTH AS d1 
    , DATE_FORMAT(NOW(),'%Y-01-01') + INTERVAL 12 MONTH AS d2 

ret瓮

d1   d2   
---------- ---------- 
2016-01-01 2017-01-01 

否则对“裸”列中的比较是,将允许MySQL来在合适的索引使用一系列扫描操作,如果有一个可用的图案。

如果我们要将列包装在一个函数中,这将强制MySQL为表中的每一行计算函数。所以我不推荐这种模式。但作为一个例子:

WHERE YEAR(t.creation_date) = YEAR(NOW()) 

EDIT

编辑的问题说created_date列被存储为小数数据类型。

只要存储的值是规范(也就是说,以后的值总是比较任何日期较早的价值“大于”)...

那么同样的模式应用...将裸露列与范围的开始和结束进行比较。

WHERE t.decimal_col >= beginning_of_this_year 
    AND t.decimal_col < beginning_of_next_year 

只需要提供(即返回十进制值或表达式)代表beginning_of_this_year和beginning_of_next_year十进制值。

如果没有关于存储值的更精确的定义以及这些值的值代表什么日期,我不能给出更具体的示例。

+0

它超出了我的预期。我真的很感激。 – user348078

0

您可以使用STR_TO_DATE功能

STR_TO_DATE('31/12/2016 8:06:26 AM', '%d/%m/%Y %r') 

和过滤

where year(STR_TO_DATE('31/12/2016 8:06:26 AM', '%d/%m/%Y %r')) = 2016