我想从数据库中返回添加的行"今年" (今年)。每行的创建日期存储为十进制格式的时间戳。
我想象的一种方法是获取当前年份的时间戳范围,然后只选择适合此范围的行。我有谷歌,但没有成功。 有没有办法比较给定年份与数据库存储的时间戳?
答案 0 :(得分: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
返回
d1 d2
---------- ----------
2016-01-01 2017-01-01
在&#34;裸&#34;上进行比较column是一种模式,允许MySQL在合适的索引上使用范围扫描操作(如果有的话)。
如果我们将列包装在一个函数中,那将迫使MySQL为表中的每一行计算函数。所以我不推荐这种模式。但作为一个例子:
WHERE YEAR(t.creation_date) = YEAR(NOW())
修改强>
编辑过的问题说created_date
列存储为十进制数据类型。
只要存储的值是 canonical (也就是说,以后日期的值将始终比较为&#34;大于&#34;任何较早日期的值)。 。
然后应用相同的模式...将裸列与范围的开始和结束进行比较。
WHERE t.decimal_col >= beginning_of_this_year
AND t.decimal_col < beginning_of_next_year
只需要提供表示begin_of_this_year和beginning_of_next_year的十进制值(或返回小数值的表达式)。
如果没有更准确地定义存储的值以及这些值所代表的日期,我无法给出更具体的示例。
答案 1 :(得分: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