2010-04-29 17 views
9

Mam następujące zapytanie, które wykorzystuje datę zmienną, która jest wytwarzana wewnątrz procedury przechowywanej:SQL Jak poprawnie ustawić wartość zmiennej daty i używać jej?

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)) 

Problem polega na tym, że wartość @sp_Date wydaje się być ignorowane i zastanawiam się dlaczego? Czy zdefiniowałem lub użyłem go niepoprawnie?

SQL Microsoft SQL-server-2008

Błąd użytkownika ...

Dzięki, R.

+1

Skąd wiesz, że jest to ignorowane? Czy widzisz wiersze na wyjściu, gdzie 'LastAdDate' jest wcześniej niż 6 dni temu? – Aaronaught

+1

Co rozumiesz przez zignorowanie? Nie filtruje czy co? –

+1

Wyciąga dane, które pochodzą sprzed ponad 6 miesięcy. Francisco Soto, tak, nie filtrując daty. – flavour404

Odpowiedz

14

Twój składnia jest w porządku, zwróci wiersze gdzie LastAdDate leży w ciągu ostatnich 6 miesięcy;

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 

Czy na pewno LastAdDate jest typu DATETIME?

+1

Właściwie miałeś rację, nie było to DATETIME, było smalldatetime i rozwiązałem problem. – flavour404

2

Jeśli ręcznie napisać kwerendę z statycznych wartości dat (np „2009-10- 29 13: 13: 07.440 ') czy masz jakieś wiersze?

Więc mówisz, że następujące dwie kwerendy produkować poprawne wyniki:

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

Jeśli ręcznie wypiszesz zapytanie, aspekt daty działa poprawnie, ale jeśli ustawię go dynamicznie w procedurze przechowywanej, otrzymam większy zbiór danych, z jakiegoś powodu zostanie zignorowana data ... – flavour404

+1

@ flavour404 - Więc jeśli spróbujesz dwa zapytania dodane do mojego posta, działają poprawnie? – Thomas

+1

Tak, działają poprawnie. – flavour404

Powiązane problemy