where子句中的EOMonth运算符

时间:2018-05-07 15:43:35

标签: sql sql-server sql-server-2012

我尝试使用前一个月从一个表中提取两列作为我的日期范围。我觉得我很亲近。当我解析 以下代码,Management Studio(SQLServer2012)告诉我命令已成功完成。当我执行查询时,响应为:消息116,级别16,状态1,行3当未使用EXISTS引入子查询时,只能在选择列表中指定一个表达式。

以下是查询...

select  (column1), (column2)
from (table1)
WHERE (column2) IN  (SELECT DATEADD(DAY,1,EOMONTH(GETDATE(),-2)) AS StartDate, EOMONTH(GETDATE(),-1) AS EndDate)
order by (column2)

select dateadd子句本身成功地拉出了该月的第一天和最后一天......我不确定如何使用EXIST运算符...厌倦了几个不同的事情,但都产生了错误。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

这是你想要做的吗?

select column1, column2
from table1
where column2 >= DATEADD(DAY, 1, EOMONTH(GETDATE(), -2)) and
      column2 <= EOMONTH(GETDATE(), -1) 
order by column2;

您的代码有一个子查询,其中没有必要。

答案 1 :(得分:1)

尝试使用BETWEEN代替IN()

SELECT column1, column2
FROM table1
WHERE column2 BETWEEN DATEADD(DAY,1,EOMONTH(GETDATE(),-2))
                  AND EOMONTH(GETDATE(),-1)

编辑:我想特别强调BETWEEN,因为这个问题让我相信IN()是从值列表中查找而不是&#34;之间的混淆。一系列价值观。

BETWEEN本身通常会让人感到困惑,如果重新编写为包含底层运算符的明确范围,可能会更好理解:

SELECT column1, column2
FROM table1
WHERE column2 >= DATEADD(DAY,1,EOMONTH(GETDATE(),-2))
AND column2 <= EOMONTH(GETDATE(),-1)

答案 2 :(得分:0)

对结束日期声明进行了调整。我现在从4-1-2018到4-30-2018获取数据。而不是&lt; =到上个月的最后一个日期,我使用&lt;这个月的第一天谢谢!

SELECT fromname,completiontime 来自文件 完成时间&gt; = DATEADD(DAY,1,EOMONTH(GETDATE(), - 2)) 和完成时间&lt; DATEADD(DAY,1,EOMONTH(GETDATE(), - 1)) 按CompletionTime desc排序