SQL Select 查询以选择日期之间的数据,其中从日期月份高于日期月份和年份差异>1

Posted

技术标签:

【中文标题】SQL Select 查询以选择日期之间的数据,其中从日期月份高于日期月份和年份差异>1【英文标题】:SQL Select query to select data between to dates where from date month is higher than the to date month and year difference is >1 【发布时间】:2014-09-05 06:35:11 【问题描述】:

我想从查询参数类似于的表中选择所有记录:

from_month: 09

to_month : 03

从年份:2011

to_year: 2014

我正在尝试以下查询:

Select * from Table 
where month(created_at) between '09' and '03' 
     and year(created_at) between '2011' and '2014' 

虽然数据在那里,但它返回零记录,因为 from_month 大于 to 月份。

我什至尝试了直接比较日期而不是分别计算月份和年份的查询,但它仍然返回零记录。

【问题讨论】:

请把你的表结构摆好 from_month 还是 from_date?还是 to_date 还是 to_month? Select * from Table where (month(created_at) >=9 OR month(created_at) 【参考方案1】:

你可以试试吗?我认为你是这样做的。它的最大值到最小值之间

where month(created_at) between '09' and '03' 

改为

where month(created_at) between '03' and '09' 

或使用大于和小于的方式

SELECT * FROM tbl WHERE month(created_at)>='09' AND month(created_at)<='11'

【讨论】:

【参考方案2】:

您的查询失败有两个原因。首先,between 需要先有下限,然后是上限。因此,beween 9 and 3 将始终为您提供0 记录。 其次,它将丢失例如'2012-01-01''2012-02-28' 之间的记录以及'2012-10-01''2013-02-28' 之间的记录。

不要让它变得更复杂。

SELECT * FROM table1
WHERE created_at BETWEEN '2011-09-01' AND '2014-03-31'

这样做也更好,因为 mysql 不能在应用函数的列上使用索引。

如果你不知道,如果日期的上限是 30、31、28 甚至 29,你可以这样做:

SELECT * FROM table1
WHERE created_at BETWEEN '2011-09-01' AND LAST_DAY('2014-03-01');

还请注意,当您的created_at 列是时间戳或日期时间类型时,您必须附加一个时间。否则你会错过最后一天的记录。

SELECT * FROM table1
WHERE created_at BETWEEN '2011-09-01' AND '2014-03-31 23:59:59'

当你不附加时间时,它会自动变为00:00:00,因此你会错过2014-03-31

【讨论】:

以上是关于SQL Select 查询以选择日期之间的数据,其中从日期月份高于日期月份和年份差异>1的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询不会选择日期之间的所有行

在日期范围SQL之间选择PHP脚本中的数据[重复]

选择查询[关闭]之间的日期

sql中查出两个日期之间的数据

SQLSERVER语句怎么查询一个时间段的数据

MySQL查询以选择带有日期的记录