我想从数据库中仅返回添加“今年”(当前年份)的行。每行的创建日期作为时间戳存储在十进制格式中。比较当前的时间戳与mysql存储的时间戳
我想象的一种方法是获取当前年份的时间戳范围,然后选择适合此范围的行。我有谷歌它,但没有成功。 有没有办法将给定年份与该数据库存储的时间戳进行比较?
我想从数据库中仅返回添加“今年”(当前年份)的行。每行的创建日期作为时间戳存储在十进制格式中。比较当前的时间戳与mysql存储的时间戳
我想象的一种方法是获取当前年份的时间戳范围,然后选择适合此范围的行。我有谷歌它,但没有成功。 有没有办法将给定年份与该数据库存储的时间戳进行比较?
通常的模式是你描述...裸列比较的范围。
我们可以使用表达式来导出范围的开始和结束。在这种情况下,年初和明年年初。
编辑
如果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十进制值。
如果没有关于存储值的更精确的定义以及这些值的值代表什么日期,我不能给出更具体的示例。
它超出了我的预期。我真的很感激。 – user348078
您可以使用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
更新您的问题并显示您的样本数据和您的表架构 – scaisEdge
什么是创建日期数据格式?字符串或时间戳? – reza
它只是一个存储为十进制类型的时间戳 - 十进制(50,0) – user348078