4

我试图将返回的数据限制为仅在当月具有开始和结束日期的那些点 - 活动项目。它的行为有问题,因为今天是本月的最后一天。我相信明天也会有问题(样本中没有 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())))
4

6 回答 6

12

使用 TSQLMonth函数:

SELECT * FROM dbo.table1
WHERE Month(Start_Date) = Month(getdate()) AND Month(End_Date) = Month(getdate())
ORDER BY User, Start_Date
于 2013-05-31T15:06:47.637 回答
10

只需将您的WHERE陈述合并为以下内容:

DATEDIFF(m, DATEFIELD, GETDATE()) = 0
于 2014-08-06T13:41:48.023 回答
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
于 2013-05-31T15:44:29.820 回答
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 字段代表月份会更简单。

于 2013-05-31T15:13:16.303 回答
0

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

于 2013-05-31T15:16:16.930 回答
-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);

于 2021-03-22T10:39:40.880 回答