【发布时间】:2010-10-12 10:44:44
【问题描述】:
我希望能够选择月份和年份与我正在搜索的内容相同的所有数据库行。由于 DATE 字段有年、月、日,我该如何搜索年月?
【问题讨论】:
-
我不想这么说,但我同意。他至少领先我5秒。 ;)
-
我认为是 42...不是我在数:P
我希望能够选择月份和年份与我正在搜索的内容相同的所有数据库行。由于 DATE 字段有年、月、日,我该如何搜索年月?
【问题讨论】:
最有效的方法是创建所需范围的开始日期和结束日期,以便将日期作为单个值进行比较,而不是从每个日期中提取年份和月份属性。
例子:
select SomeField
from SomeTable
where SomeDate >= ? and SomeDate < ?
(请注意,第一个比较是包含的,第二个是排除的。)
创建开始日期和结束日期以用作参数:(C# 中的示例)
DateTime start = new DateTime(date.Year, date.Month, 1)
DateTIme end = start.AddMonths(1);
【讨论】:
SELECT *
FROM tblTableName
WHERE Month(ColumnDate) = Month(MyDate)
AND Year(ColumnDate) = Year(MyDate)
【讨论】:
在MySQL中:
SELECT *
FROM mytable
WHERE date >= STR_TO_DATE(CONCAT(EXTRACT(YEAR_MONTH FROM @mydate), '01'), '%Y%m%d')
AND date < STR_TO_DATE(CONCAT(EXTRACT(YEAR_MONTH FROM @mydate), '01'), '%Y%m%d') + INTERVAL 1 MONTH
这将有效地使用date 字段上的索引。
【讨论】:
这取决于您使用的数据库后端。我会在 SQL Server 中使用
where year(datefield) = @year and month (datefield) - @month
这样做。
或者您可以通过创建日期范围来构建 where 子句
日期字段在 20090101 和 20090201 之间
【讨论】:
SELECT *
FROM myTable
WHERE ( YEAR(myfield) = '2009')
AND ( MONTH(myfield) = '1')
【讨论】: