Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 将返回日期限制为当前月份的SQL查询_Sql Server 2008_Datetime_Filter_Getdate - Fatal编程技术网

Sql server 2008 将返回日期限制为当前月份的SQL查询

Sql server 2008 将返回日期限制为当前月份的SQL查询,sql-server-2008,datetime,filter,getdate,Sql Server 2008,Datetime,Filter,Getdate,我试图将返回的数据限制在当前月活动项目中具有开始和结束日期的点。它的行为有问题,因为今天是一个月的最后一天。我相信明天也会是个问题(样本中没有6月份的数据) 以下是我的数据集(表1): 今天使用以下查询时,我没有得到任何返回结果: SELECT * FROM dbo.table1 WHERE Start_Date <= (getdate()) AND End_Date >= (getdate()) ORDER BY User, Start_Date 从dbo.table1中选择*

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

以下是我的数据集(表1):

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

SELECT * FROM dbo.table1
WHERE Start_Date <= (getdate()) AND End_Date >= (getdate())
ORDER BY User, Start_Date
从dbo.table1中选择*
其中开始日期=(getdate())
按用户订购,开始日期
昨天天气很好。我也有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())))
其中(月(开始日期)=月((getdate()))和(年(开始日期)=年((getdate()))

使用TSQL
功能:

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

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

日期以记号表示,表示小于秒。如果比较GetDate()(对于exmaple,它是2013-05-31 11:09:45:1024,不确定mssql中的毫秒精度),它将始终大于2013-05-31,因为小时/分钟/秒。您的两个选择是比较
YOURDATE>=开始日期和结束日期+1>您的日期
,或
YOURDATE>=开始日期和结束日期>=转换(日期,您的日期)

第一个选项要求它严格小于结束日期的第二天(因此基本上是当天的最后一天),第二个选项要求它与结束日期在同一天内,忽略刻度。两者产生的结果完全相同,其中一个可能更有效,但我无法在这方面提供帮助


编辑:或者你可以使用另外两个答案,除非它只有在你总是使用月周期的情况下才有效。在这种情况下,将数据库重新设计为只包含1-12个表示月份的字段会更简单。

在MySql中,我使用类似的方法在x天内更新数据,可能类似于:
start\u date以下查询可以利用索引,因为它不会对每一行执行计算。此外,它还将在一个月内的任何时间处于活动状态的任何项目返回为“活动”,例如,在该月最后一周开始并在几个月后结束的项目。而且它很容易测试和修改,因为它将日期算法从查询中分离出来

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
将@Today声明为Date=GetDate()
声明@StartOfMonth为日期=DateAdd(天,1天(@Today),@Today)
将@EndOfMonth声明为Date=DateAdd(day,-1,DateAdd(month,1,@StartOfMonth))
选择@Today为[Today]、@StartOfMonth为[StartOfMonth]、@EndOfMonth为[EndOfMonth]
挑选*
来自表1
其中开始日期=@StartOfMonth

只需将您的
WHERE
语句合并为如下内容:

DATEDIFF(m, DATEFIELD, GETDATE()) = 0
在MySQL上试试这个


选择日期(加入日期),从用户中计算(*),其中月(加入日期)=月(现在())和年(加入日期)=年(现在())按日期分组(加入日期)

那么你不在乎年份了?可以吗?嗯,这是一个有效的观点。。。我只放了5月份的样本数据。@Shrout1在这种情况下,您可以添加检查
YEAR()
函数,也可以添加这是我最后的WHERE语句:
WHERE(月(开始日期)=月((getdate()))和(年(开始日期)=年((getdate()))
由于您只查找当前月份和年份,我认为您可以将=替换为=开始日期和结束日期是否始终是该月的第一个和最后一个日期?“活动”项目是否包括较早启动的项目或较晚运行的项目?您希望结果限制在本年度吗?有必要限制在本年度。。。也许我太仓促了,哈哈。我已经设置了数据输入,使得开始和日期只在月初/月底。检查答案下面的“WHERE”语句的最后一部分是否符合我的需要。使用正确的文本格式。在编写代码时使用``。
DATEDIFF(m, DATEFIELD, GETDATE()) = 0