Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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:Where子句_Sql_Sql Server - Fatal编程技术网

SQL:Where子句

SQL:Where子句,sql,sql-server,Sql,Sql Server,上述查询为我提供了2015-03-01和2015-03-31之间任何日期活动的活动id的结果 如果在2015-03-01和2015-03-31之间的所有日期活动,我希望结果集包含活动id 我该怎么做呢?假设DATE是一个日期数据类型,没有时间组件 SELECT DISTINCT Campaign_id FROM Impressions WHERE Date BETWEEN '2015-03-01' AND '2015-03-31' ; 或者是没有变量的版本 DECLARE @Start D

上述查询为我提供了2015-03-01和2015-03-31之间任何日期活动的活动id的结果

如果在2015-03-01和2015-03-31之间的所有日期活动,我希望结果集包含活动id

我该怎么做呢?

假设DATE是一个日期数据类型,没有时间组件

SELECT DISTINCT Campaign_id 
FROM Impressions 
WHERE Date BETWEEN '2015-03-01' AND '2015-03-31' ;
或者是没有变量的版本

DECLARE @Start DATE = '2015-03-01',
        @End   DATE = '2015-03-31'

SELECT Campaign_id
FROM   Impressions
WHERE  Date BETWEEN @Start AND @End
GROUP  BY Campaign_id
HAVING COUNT(DISTINCT Date) = 1 + DATEDIFF(DAY, @Start, @End); 
使用带有COUNTDISTINCT的HAVING子句:

您还应该回顾一下Aaron Betrand的这篇文章,了解为什么在日期中使用BETWEEN是个坏主意

通过执行以下操作,可以使查询只提及一次日期:

SELECT Campaign_id 
FROM Impressions
WHERE Date between '2015-03-01' and '2015-03-31' 
GROUP BY Campaign_id
HAVING COUNT(DISTINCT Date) = 31;

注意:在这种情况下,有些人更喜欢连接而不是交叉连接。习惯上,我总是使用交叉连接在查询中输入参数CTE。

使用between表示日期没有错,问题只存在于使用DateTimeWorks完美的情况下,谢谢。效果很好,给了我想要的结果。如果你能告诉我最后一行是如何工作的,那就太好了,我没听清楚。@TauseefHussain-如果他们在三月份的每个日期都很活跃,这意味着他们在那个月的31个不同的日子里都很活跃,DATEDIFF就避免了硬编码这个数字。我的错!道歉!那是个错误,Facepalm!!不过,感谢您指出:
SELECT Campaign_id 
FROM Impressions
WHERE Date between '2015-03-01' and '2015-03-31' 
GROUP BY Campaign_id
HAVING COUNT(DISTINCT Date) = 31;
WITH params as (
      SELECT CAST('2015-03-01' as DATE) as date1, CAST('2015-03-31' as DATE) date2
     )
SELECT i.Campaign_id
FROM params CROSS JOIN
     Impressions i
WHERE i.Date >= params.Date1 and i.Date < DATEADD(day, 1, params.Date2)
GROUP BY i.Campaign_id, params.date1, params.date2
HAVING COUNT(DISTINCT i.Date) = 1 + DATEDIFF(day, params.date1, params.date2);