开发者

t-sql datetime question

@EndDate = 2010-05-31

select * from TableName where OrderNo = 'AB103' and month(SendDate) = month(dateadd(mm,-1,@EndDate))

is returning 2 values which has same month (which is April) but different years like 2010 and 2009.

How can I change this query so that it returns value only of year 2010 and month remains April?

I have used (CONVERT(VARCHAR(6),(dateadd(mm,-1,2010-05-31)),112)+'01') instead for 2010-04-01 What is wrong with this code? SendDate = (CONVERT(VARCHAR(6),(dateadd(mm,-1,2010-05-31)),112)+'01')

I dont need value in 2010-04-01 fo开发者_如何学运维rm I want it in this form (CONVERT(VARCHAR(6),(dateadd(mm,-1, @EndDate)),112)+'01') What mistake I am making?

Anyone??


Use an explicit range check:

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

This is correct and also efficient because this expression is SARGable and can leverage an index on the SendDate column. Using explicit comparison operators avoid the ambiguity of between operator (does it include the right side or not? I can never remember, so avoid it altogether). Also using the canonical date format 'yyyymmdd' avoids any issue from running your code on different locales (SET DATEFORMAT).


try:

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


You can use "between" to limit the range of dates:

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

Note that this assumes you are storing dates without times. It would not return a SendDate that was during the afternoon of 4/30/11.


I would do it this way

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜