15

我有一个 mysql 数据库,它有一个名为日期的 TIMESTAMP 字段。如何选择月份为当前月份的所有字段?

提前致谢!

4

11 回答 11

32

更新

一种更好的索引友好方式来查询日期范围内的数据

SELECT id, FROM_UNIXTIME(timestampfield) timestamp 
  FROM table1
 WHERE timestampfield >= UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH)
   AND timestampfield <  UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + INTERVAL 1 DAY);

注意: 您不对列数据应用任何函数,而是在条件的右侧进行所有必要的计算(这些是常量,仅在执行后评估一次)。timestampfield通过这种方式,您可以让 MySQL 从您可能在列上拥有的索引中受益。

原答案:

SELECT id, FROM_UNIXTIME(timestampfield) timestamp 
  FROM table1
 WHERE MONTH(FROM_UNIXTIME(timestampfield)) = MONTH(CURDATE())
   AND YEAR(FROM_UNIXTIME(timestampfield)) = YEAR(CURDATE())

注意:虽然这个查询产生了正确的结果,但它实际上使您可能在timestampfield列上拥有的索引的正确使用无效(意味着 MySQL 将被迫执行全扫描)

这是SQLFiddle演示

于 2013-05-11T18:47:50.350 回答
7

使用此查询可能会对您有所帮助,

Query = "SELECT * FROM <table_name> WHERE MONTH(date_entered) = MONTH(CURDATE())";
于 2015-03-19T12:29:25.733 回答
3

如果要使用索引,请不要对列应用任何函数:

SELECT * 
FROM tableX
WHERE `date` >= UNIX_TIMESTAMP((LAST_DAY(NOW())+INTERVAL 1 DAY)-INTERVAL 1 MONTH)
  AND `date` <  UNIX_TIMESTAMP(LAST_DAY(NOW())+INTERVAL 1 DAY) ;

使用的函数可以在 MySQL 文档中找到:Date and Time functions

于 2013-05-11T19:21:19.507 回答
3

在我看来,以下内容比接受的答案更具可读性......

SELECT id, FROM_UNIXTIME(timestampfield) timestamp 
FROM table1
WHERE timestampfield >= DATE_FORMAT(NOW(), '%Y-%m-01')

注意:这也会选择下个月的任何记录。这通常无关紧要,因为尚未创建任何内容。

于 2018-03-07T21:23:49.997 回答
2

尝试这个

SELECT * FROM table WHERE month(data) = EXTRACT(month FROM (NOW()))
于 2013-08-16T19:57:57.217 回答
2
SELECT 'data of your choice '
FROM 'your table'
WHERE
MONTH'datecolumn'=MONTH(CURRENT_DATE )

用您的数据库中的适当替换“”中的文本

于 2015-06-27T10:40:33.823 回答
1
SELECT [columns] 
FROM [the_table] 
WHERE MONTH([date_column]) = MONTH(CURDATE())

用您的数据替换 [](包括 [])之间的文本。

于 2015-08-12T00:57:37.270 回答
0

下面的查询可以从索引中受益,并且没有函数应用于 where 子句评估的时间戳字段。

SELECT * 
FROM TableName 
WHERE TimestampField >= 
           (CURDATE() - INTERVAL (DAY(CURDATE())-1) DAY) 
      AND TimestampField <  
           LAST_DAY(CURDATE()) + INTERVAL 1 DAY;

如果您的时间戳字段是时间部分被截断,请选择这个,

SELECT * 
FROM TableName 
WHERE TimestampField BETWEEN 
           (CURDATE() - INTERVAL (DAY(CURDATE())-1) DAY) 
         AND 
           LAST_DAY(CURDATE());
于 2019-11-26T08:38:42.557 回答
0

从 2020 年开始,您可以从一开始就使用 BETWEEN 处理查询。

SELECT *
FROM [TABLE]
WHERE [DATE_FIELD] 
BETWEEN 
CAST('2020-30-01' AS DATE) AND CAST('2020-10-31' AS DATE);

我知道这不是最“自动”的方式,但从 SQL 的角度来看,它非常友好和直接。

来源 https://www.techonthenet.com/mysql/between.php

于 2020-10-30T15:35:15.647 回答
0

试试这个,因为它的范围会更好。您不需要为每一行计算月份和年份。它会减慢这个过程。用户范围以获得更好的性能。

SELECT * FROM table WHERE columnName between DATE_FORMAT(current_date() ,'%Y-%m-01') and current_date();
于 2021-01-22T07:31:12.787 回答
-3

我认为在 MySQL 中,这是我尝试过并且效果很好的最简单方法,您想选择timestampfield本月所在的行。

SELECT * FROM your_table 
WHERE MONTH(timestampfield)=MONTH(CURRENT_DATE()) AND
YEAR(timestampfield)=YEAR(CURRENT_DATE());

以上将返回mysql中该月timestampfield是本月的所有记录

于 2015-04-14T07:08:15.953 回答