@EndDate = 2010-05-31
选择* 来自TableName 其中OrderNo ='AB103' 和月份(SendDate)=月份(dateadd(mm,-1,@ EndDate))
返回2个具有相同月份(即4月份)但不同年份的值 像2010年和2009年。
如何更改此查询以使其仅返回2010年的值,而月份仍为4月?
我用过(CONVERT(VARCHAR(6),(dateadd(mm,-1,2010-05-31)),112)+'01') 而是2010-04-01 这段代码有什么问题? SendDate =(CONVERT(VARCHAR(6),(dateadd(mm,-1,2010-05-31)),112)+'01')
我在2010-04-01表格中不需要价值 我希望它以这种形式(CONVERT(VARCHAR(6),(dateadd(mm,-1,@ EndDate)),112)+'01') 我犯了什么错误?
任何??
答案 0 :(得分:4)
使用明确的范围检查:
select *
from TableName
where OrderNo = 'AB103'
and SendDate >= '20100401'
and SendDate < '20100501';
这是正确且有效的,因为此表达式是SARGable并且可以利用SendDate列上的索引。使用显式比较运算符可以避免between
运算符的歧义(它是否包括右侧?我永远不记得,所以完全避免它)。另外,使用规范日期格式'yyyymmdd'可避免在不同语言环境(SET DATEFORMAT
)上运行代码时出现任何问题。
答案 1 :(得分:1)
尝试:
select * from TableName
where OrderNo = 'AB103'
and DateDiff(month, SendDate, '2010-04-01') = 0
答案 2 :(得分:0)
您可以使用“between”来限制日期范围:
select *
from TableName
where OrderNo = 'AB103' and SendDate between '4/1/2010' and '4/30/2011'
请注意,这假设您没有时间存储日期。它不会返回在4/30/11下午发送的SendDate。
答案 3 :(得分:0)
我会这样做
select *
from TableName
where OrderNo = 'AB103'
and DatePart(yyyy,SendDate) = 2010
and DatePart(m,SendDate) = 4