2010-04-29 87 views
9

我有使用日期变量,它在存储过程中生成以下查询:SQL如何正确设置日期变量值并使用它?

DECLARE @sp_Date DATETIME 
SET @sp_Date = DateAdd(m, -6, GETDATE()) 

SELECT DISTINCT pat.PublicationID 
    FROM PubAdvTransData AS pat 
    INNER JOIN PubAdvertiser AS pa ON pat.AdvTransID = pa.AdvTransID 
    WHERE (pat.LastAdDate > @sp_Date) AND (pa.AdvertiserID = 12345)) 

的问题是,@sp_Date价值似乎被忽略了,我想知道为什么?我有没有定义或使用它不正确?

SQL的Microsoft SQL服务器2008

用户错误...

感谢,R.

+1

你怎么知道它被忽略?你在输出中看到LastAdDate早于6天前的行吗? – Aaronaught 2010-04-29 20:12:36

+1

你是什么意思被忽略?不是过滤或什么? – 2010-04-29 20:12:46

+1

这是从6个月以前的数据拉动。弗朗西斯科·索托,是的,没有过滤日期。 – flavour404 2010-04-29 20:23:43

回答

14

你的语法是好的,它会返回行,其中LastAdDate谎言在过去6个月内;

select cast('01-jan-1970' as datetime) as LastAdDate into #PubAdvTransData 
    union select GETDATE() 
    union select NULL 
    union select '01-feb-2010' 

DECLARE @sp_Date DATETIME = DateAdd(m, -6, GETDATE()) 

SELECT * FROM #PubAdvTransData pat 
    WHERE (pat.LastAdDate > @sp_Date) 

>2010-02-01 00:00:00.000 
>2010-04-29 21:12:29.920 

确定LastAdDateDATETIME型的?

+1

其实你是对的,这不是DATETIME是smalldatetime,我已经解决了这个问题。 – flavour404 2010-04-30 00:02:51

2

如果手动写出来与静态日期值的查询(例如“2009-10- 29 13:13:07.440')你有没有行?

那么,你是说下面两个查询产生正确的结果:

SELECT DISTINCT pat.PublicationID 
FROM PubAdvTransData AS pat 
    INNER JOIN PubAdvertiser AS pa 
     ON pat.AdvTransID = pa.AdvTransID 
WHERE (pat.LastAdDate > '2009-10-29 13:13:07.440') AND (pa.AdvertiserID = 12345)) 

DECLARE @sp_Date DATETIME 
SET @sp_Date = '2009-10-29 13:13:07.440' 

SELECT DISTINCT pat.PublicationID 
FROM PubAdvTransData AS pat 
    INNER JOIN PubAdvertiser AS pa 
     ON pat.AdvTransID = pa.AdvTransID 
WHERE (pat.LastAdDate > @sp_Date) AND (pa.AdvertiserID = 12345)) 
+1

如果我手动编写查询日期方面工作正常,但如果我在存储过程中动态设置它,我会得到一个更大的数据集,日期由于某种原因被忽略... – flavour404 2010-04-29 20:23:18

+1

@ flavour404 - 所以,如果你尝试我添加到我的文章的两个查询,他们工作正常? – Thomas 2010-04-29 20:36:44

+1

是的,他们工作正常。 – flavour404 2010-04-30 00:01:38

相关问题