SQL Query将返回日期限制为当前月份

时间:2013-05-31 15:03:00

标签: sql-server-2008 datetime filter getdate

我正在尝试将返回的数据限制为仅包含当前月份中的开始日期和结束日期的那些点 - 活动项目。它的行为有问题,因为今天是这个月的最后一天。我相信明天也会出现问题(样本中没有6月的数据)。

这是我的数据集(表1):

Project                      User                 Effort  Start_Date End_Date
-------                      -------              ------  --------   --------
Traffic Control              DOMAIN\john.smith    0.1     5/1/2013   5/31/2013
Turboencabulator Analysis    DOMAIN\mark.webber   0       5/1/2013   5/31/2013
Widget Calibration           DOMAIN\mark.webber   0       5/1/2013   5/31/2013
Gizmo Creation               DOMAIN\steve.green   0.1     5/1/2013   5/31/2013
Advanced Toolmaking          DOMAIN\steve.green   0.6     5/1/2013   5/31/2013
Diesel Engine Diagnostics    DOMAIN\steve.green   0.05    5/1/2013   5/31/2013
Cold Fusion Reactor Creation DOMAIN\steve.green   0.3     5/1/2013   5/31/2013

今天使用以下查询时,我没有返回结果:

SELECT * FROM dbo.table1
WHERE Start_Date <= (getdate()) AND End_Date >= (getdate())
ORDER BY User, Start_Date

昨天回来很好。我也有6月份的数据(未在我的样本中显示)但我需要修改我的陈述,以便它可以在整个月中可靠地返回当月的数据。

回答 - 更正WHERE语句(来自下面的回答中的评论):

WHERE (Month(Start_Date) <= Month((getdate())) AND Month(End_Date) >= Month((getdate()))) AND (YEAR(Start_Date) <= YEAR((getdate())) AND YEAR(End_Date) >= YEAR((getdate())))

6 个答案:

答案 0 :(得分:10)

使用TSQL Month函数:

SELECT * FROM dbo.table1
WHERE Month(Start_Date) = Month(getdate()) AND Month(End_Date) = Month(getdate())
ORDER BY User, Start_Date

答案 1 :(得分:7)

只需将WHERE语句合并为:

DATEDIFF(m, DATEFIELD, GETDATE()) = 0

答案 2 :(得分:2)

以下查询可以利用索引,因为它不会对每一行执行计算。此外,它在任何时候在任何时间活动的任何项目都返回“活动”,例如一个项目,从该月的最后一周开始,到几个月后结束。而且它很容易测试和修改,因为它将日期算术与查询分开。

declare @Today as Date = GetDate()
declare @StartOfMonth as Date = DateAdd( day, 1 - Day( @Today ), @Today )
declare @EndOfMonth as Date = DateAdd( day, -1, DateAdd( month, 1, @StartOfMonth ) )

select @Today as [Today], @StartOfMonth as [StartOfMonth], @EndOfMonth as [EndOfMonth]

select *
  from Table1
  where Start_Date <= @EndOfMonth and End_Date >= @StartOfMonth

答案 3 :(得分:0)

您应该尝试使用convert(date, GetDate())GetDate()

日期表示为刻度,表示小于秒。如果你比较GetDate()(2013-05-31 11:09:45:1024为例,不确定mssql中的毫秒精度),它将始终大于2013-05-31,因为小时/分钟/秒。您的两个选择是比较YOURDATE >= Start_Date AND End_Date + 1 > YOURDATEYOURDATE >= Start_Date AND End_Date >= convert(date, YOURDATE)

第一个选项要求它比结束日期的明天要小得多(所以基本上是当天的结束),第二个选项要求它在结束日期的同一天内,忽略滴答声。两者都产生完全相同的结果,其中一个可能更高效,但我无法帮助这方面。

编辑:或者您可以使用其他两个答案,但只有在您总是使用月度期间才会有效。在这种情况下,将数据库重新设计为只有1-12字段代表月份会更简单。

答案 4 :(得分:0)

在MySql中,我使用类似的东西在x天内更新数据,可能是这样的: start_date <= DATE_SUB(curdate(), INTERVAL 10 DAY); 只需将10更改为您需要的任何天数。

答案 5 :(得分:-1)

试试这个用于 MySQL

select date(date_joined),count(*) from users where MONTH(date_joined)=MONTH(now()) and YEAR(date_joined)=YEAR(now()) group by date(date_joined);