t-sql日期时间问题

时间:2011-07-26 18:54:47

标签: sql sql-server tsql

@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)),11​​2)+'01') 而是2010-04-01 这段代码有什么问题? SendDate =(CONVERT(VARCHAR(6),(dateadd(mm,-1,2010-05-31)),11​​2)+'01')

我在2010-04-01表格中不需要价值 我希望它以这种形式(CONVERT(VARCHAR(6),(dateadd(mm,-1,@ EndDate)),11​​2)+'01') 我犯了什么错误?

任何??

4 个答案:

答案 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