2011-07-26 60 views
-1
@EndDate = 2010-05-31 

SELECT * 从表名 其中OrderNo = 'AB103' 和月(SendDate)=月(DATEADD(毫米,-1,@结束日期))吨-SQL日期时间问题

在返回2不同年份 (如2010和2009年)的值。

如何更改此查询以使其仅返回2010年的值和月份仍然是4月的值?

我用过(CONVERT(VARCHAR(6),(dateadd(mm,-1,2010-05-31)),11​​2)+'01') 而不是2010-04-01 什么是错用这个代码? SendDate =(CONVERT(VARCHAR(6),(DATEADD(毫米,-1,2010-05-31)),11​​2)+ '01')

我不需要在2010-04-01形式 值我想以这种形式(CONVERT(VARCHAR(6),(dateadd(mm,-1,@EndDate)),11​​2)+'01') 我正在犯什么错误?

任何??

+0

日期文字必须包含在字符串。 2010年5月31日是2010年减去5减去31,这是1905年5月29日。 –

+0

我刚刚添加更多的细节,我的问题 – user680865

+0

把日期'喜欢选择(CONVERT(VARCHAR(6),(dateadd(mm, - 1,'2010-05-31')),11​​2)+'01') – THEn

回答

0

您可以使用“之间”,以限制日期范围:

select * 
    from TableName 
    where OrderNo = 'AB103' and SendDate between '4/1/2010' and '4/30/2011' 

注意,这里假设你存储日期没有时间。它不会返回4月30日下午的SendDate。

+0

我已经使用(CONVERT(VARCHAR(6),(dateadd(mm,-1,2010-05-31)),11​​2)+ '01')而不是2010-04-01这段代码有什么问题? SendDate> =(CONVERT(VARCHAR(6),(dateadd(mm,-1,2010-05-31)),11​​2)+'01') – user680865

+0

我不需要价值在2010-04-01形式我想要它在这种形式(CONVERT(VARCHAR(6),(dateadd(mm,-1,2010-05-31)),11​​2)+'01')我正在犯什么错误? – user680865

+0

你忘了把日期放在''我的意思是2010-05-31是数学表达式。你应该把'2010-05-31' – THEn

1

尝试:

 select * from TableName 
     where OrderNo = 'AB103' 
      and DateDiff(month, SendDate, '2010-04-01') = 0 
4

使用一个明确的范围检查:

select * 
    from TableName 
    where OrderNo = 'AB103' 
    and SendDate >= '20100401' 
    and SendDate < '20100501'; 

这是正确的,也是有效的,因为这种表达优化搜索,并可以利用在SendDate列的索引。使用明确的比较运算符可以避免运算符含糊不清(它是否包含正确的一面?我永远不会记住,所以完全避免它)。同样使用规范日期格式“yyyymmdd”可避免在不同语言环境上运行代码的任何问题(SET DATEFORMAT)。

+0

+1 - 范围是迄今为止最安全的选择(因为是yyyymmdd),并且有可能是最好的表现(它可以不比不可选择的更糟糕)。 –

+0

我已经为我的问题添加了更多细节 – user680865

0

我会做这样

select * 
    from TableName 
    where OrderNo = 'AB103' 
    and DatePart(yyyy,SendDate) = 2010 
    and DatePart(m,SendDate) = 4