2011-08-02 8 views
7

Muszę zaktualizować City.Date w tabeli Miasto i mam kolumny w tabeli, takie jak Przerwa i Okres w tabeli Miasto.wyślij datepart jako parametr z tabeli do funkcji DATEADD w serwerze sql

Kolumna przedziałowa zawiera wartości takie jak yy, ww, dd, qq itd., A kolumna Okres zawiera wartości takie jak 1,2,3.

Próbuję zaktualizować City.Date takiego:

UPDATE City 
SET City.date = DATEADD(City.Interval, City.Period, City.date) 
WHERE CityId = 13 

Jest coraz błąd jak:

City.Interval nie jest rozpoznawany opcję DateAdd.

Jak mogę zaktualizować City.Date użyciu City.Interval, City.Period i City.date?

Odpowiedz

12

Nie można sparametryzuj interwału trochę

UPDATE City 
SET date = CASE Interval 
       WHEN 'yy' THEN DATEADD(yy, Period, date) 
       WHEN 'ww' THEN DATEADD(ww, Period, date) 
       WHEN 'dd' THEN DATEADD(dd, Period, date) 
       WHEN 'qq' THEN DATEADD(qq, Period, date) 
       WHEN ... 
      END 
WHERE CityId =13 
+0

Dzięki gbn. To działało dla mnie. Dobre rozwiązanie. – Avinash

+0

@Avinash: nie ma za co. Proszę zagłosować i/lub zaakceptować moją odpowiedź (up i tick po lewej). Zobacz http://meta.stackexchange.com/questions/7237/how-does-reputation-work – gbn

0

Wiem, że to stary, ale zawsze robi dynamiczny SQL, aby funkcja DateAdd zaakceptować parametr. Cóż, dzisiaj inna trasa została kliknięta, więc zrobiłem dla mnie funkcję, która go znokautuje.

ten sposób mogę nazwać jak tak

declare @datepart_vc varchar(20) 
set @datepart_vc = 'day' 
select dbo.Dateadd2(@datepart_vc,1,getdate()) 

Funkcja

CREATE FUNCTION dbo.DateAdd2 
(
    -- Add the parameters for the function here 
      @DatePart_VC VARCHAR(20) 
     , @Number_IN INT 
     , @Date_DT DATETIME 
) 
RETURNS DATETIME 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @Return_DT AS DATETIME 

    -- Add the T-SQL statements to compute the return value here 
    SELECT @Return_DT = (
     CASE 
      WHEN @DatePart_VC = 'year' THEN DATEADD(year,@Number_IN,@Date_DT) 
      WHEN @DatePart_VC = 'quarter' THEN DATEADD(quarter,@Number_IN,@Date_DT) 
      WHEN @DatePart_VC = 'month' THEN DATEADD(month,@Number_IN,@Date_DT) 
      WHEN @DatePart_VC = 'dayofyear' THEN DATEADD(dayofyear,@Number_IN,@Date_DT) 
      WHEN @DatePart_VC = 'day' THEN DATEADD(day,@Number_IN,@Date_DT) 
      WHEN @DatePart_VC = 'week' THEN DATEADD(week,@Number_IN,@Date_DT) 
      WHEN @DatePart_VC = 'weekday' THEN DATEADD(weekday,@Number_IN,@Date_DT) 
      WHEN @DatePart_VC = 'hour' THEN DATEADD(hour,@Number_IN,@Date_DT) 
      WHEN @DatePart_VC = 'minute' THEN DATEADD(minute,@Number_IN,@Date_DT) 
      WHEN @DatePart_VC = 'second' THEN DATEADD(second,@Number_IN,@Date_DT) 
      --WHEN @DatePart_VC = 'millisecond' THEN DATEADD(millisecond,@Number_IN,@Date_DT) 
      --WHEN @DatePart_VC = 'microsecond' THEN DATEADD(microsecond,@Number_IN,@Date_DT) 
      --WHEN @DatePart_VC = 'nanosecond' THEN DATEADD(nanosecond,@Number_IN,@Date_DT) 

     END 

    ) 

    -- Return the result of the function 
    RETURN @Return_DT 
Powiązane problemy