按字段的月份选择

Pan*_*kaj 19 mysql

如何使用月/年从表中获取记录?我有这样一张桌子:

Name - varchar
DueDate -datetime
Status -boll
Run Code Online (Sandbox Code Playgroud)

DueDate 是项目截止日期,我想要记录对应月/年,而不是完整日期,我的意思是特定月份的记录.

我怎么能在mysql中这样做?

Kee*_*per 58

只需使用MONTH()YEAR():

SELECT * FROM Project WHERE MONTH(DueDate) = 1 AND YEAR(DueDate) = 2010
Run Code Online (Sandbox Code Playgroud)

  • 如果`duedate`列上存在索引,则不会使用索引.Todd R的答案是最好的选择. (5认同)

Tod*_*d R 27

您可以使用之间的语句:

select * from Project 
  where DueDate between '2010-01-01' and '2010-02-01'
Run Code Online (Sandbox Code Playgroud)

  • +1:如果`duedate`列中存在索引,则将使用索引; 使用MONTH&YEAR函数的答案不会. (7认同)
  • 小心,`BETWEEN` 在两端都是 *inclusive*,所以这会给你从 2 月 1 日开始的记录,这不是你想要的。最佳选择是`select * from Project where DueDate between '2010-01-01' and LAST_DAY('2010-01-01')` (3认同)

Eda*_*Eda 6

不要使用此这里推荐的解决方案MONTH()YEAR().它阻止MySQL在列上使用索引,DueDate如果你有一个,它会强制MySQL检查表中的所有行.

相反,使用这样的BETWEEN子句:

SELECT * FROM Project 
WHERE DueDate BETWEEN '2010-01-01' AND '2010-02-01'
Run Code Online (Sandbox Code Playgroud)

或IN子句的另一个解决方案:

SELECT * FROM Project 
WHERE DueDate IN ('2010-01-01', '2010-01-02', '2010-01-03', ..., '2010-01-31')
Run Code Online (Sandbox Code Playgroud)

这两个解决方案允许MySQL使用索引,因此性能会更好.

  • 第二个是没用的.谁愿意提供31个日期而不是2个?! (3认同)
  • 每个功能都有其用途.也许有人需要从日期列表中进行选择. (2认同)