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

问题描述 投票:0回答:7

我试图将返回的数据限制为仅包含当月开始和结束日期的那些点 - 活动项目。它的行为有问题,因为今天是该月的最后一天。我相信明天也将是一个问题(样本中不包含六月数据)。

这是我的数据集(表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())))
sql-server-2008 datetime filter getdate
7个回答
13
投票

使用TSQL

Month
函数:

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

11
投票

只需将您的

WHERE
陈述合并为:

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

3
投票

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

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

0
投票

您应该尝试使用

convert(date, GetDate())GetDate()

日期以刻度表示,表示小于秒。如果您比较 GetDate() (例如 2013-05-31 11:09:45:1024,不确定 mssql 中的毫秒精度),由于小时/分钟,它将始终大于 2013-05-31 /秒。您的 2 个选择是比较

YOURDATE >= Start_Date AND End_Date + 1 > YOURDATE
,或
YOURDATE >= Start_Date AND End_Date >= convert(date, YOURDATE)

第一个选项要求它严格小于结束日期的次日(所以基本上是当天的最后一天),第二个选项要求它在结束日期的同一天内,忽略刻度。两者都产生完全相同的结果,其中一个可能性能更高,但是我在这方面无能为力。

编辑:或者您可以使用其他两个的答案,但它只有在您始终使用每月周期时才有效。在这种情况下,重新设计数据库以仅包含代表月份的 1-12 字段会更简单。


0
投票

在MySql中,我使用类似的方法在x天内更新数据,也许是这样的:

start_date <= DATE_SUB(curdate(), INTERVAL 10 DAY);
只需将 10 更改为您需要的任意天数即可。


0
投票

从 dbo.table1 中选择 * WHERE trunc(Start_Date, 'MM') = trunc(sysdate, 'MM') 按用户订购,开始日期

这将按月截断开始日期,从而仅选择当前月份的开始日期


-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);

© www.soinside.com 2019 - 2024. All rights reserved.