при вычислении хранимой процедуры datediff возникает синтаксическая ошибка

У меня есть такая хранимая процедура:

alter procedure [dbo].[IBS_fetchreqVehicleinPodiumtestnew1]
   @locid INTEGER = NULL
AS BEGIN
   SET NOCOUNT ON

   DECLARE @TodayMinus7Days DATETIME
Declare @krrt integer
Declare @DT integer
   SET @TodayMinus7Days = getdate()-7

   SELECT  
       t.TBarcode, t.PlateNo, t.DelEcode
       if t.status=3
       begin
       @krrt=datediff(MINUTE, t.PayDate, GETDATE())
         end
         else
         if t.status=4
         begin
         @krrt=datediff(MINUTE, t.PayDate, t.t.KeyRoomDate)
         end
         if t.status=5
         begin 
         @dt=datediff(minute,t.paydate,t.Deldate)
         end
   FROM    
       dbo.Transaction_tbl t
   WHERE   
       ([status] IN (3,4) AND locid = @locid AND dtime >= @TodayMinus7Days)
       OR 
       ([status] = 5 AND DATEDIFF(n, CAST(DelDate AS DATETIME), GETDATE()) <= 3 AND locid = @locid AND dtime >= @TodayMinus7Days)
   ORDER BY  
       paydate
END

при выполнении хранимой процедуры, если соответствующий статус Tbarcode равен 3, тогда я хочу показать разницу между paydate и текущим временем ti..if статус 4, тогда я хочу показать разницу между t.paydate и t.keyroomdate, если статус равен 5, тогда я хотите показать разницу между этой конкретной датой... но при выполнении этой хранимой процедуры возникает ошибка.


person user3262364    schedule 11.04.2014    source источник
comment
Пожалуйста, также добавьте сообщение об ошибке   -  person Raj    schedule 11.04.2014
comment
Что такое сообщение об ошибке?   -  person Reza    schedule 11.04.2014
comment
if — оператор управления потоком. Вы не можете поставить один в середине оператора SELECT. Кроме того, вы не можете совмещать извлечение данных и присвоение переменных в одном SELECT. Поскольку вы больше нигде в хранимой процедуре не используете @krrt и @dt, и они являются локальными переменными, почему вы пытаетесь присвоить им значения?   -  person Damien_The_Unbeliever    schedule 11.04.2014
comment
Используйте операторы Case для выполнения этой логики. См. msdn.microsoft.com/en-us/library/ms181765.aspx   -  person Anthony Horne    schedule 11.04.2014


Ответы (2)


Если вы просто хотите получить эти DATEDIFF результаты как еще один столбец в вашем наборе результатов, это должно быть просто:

   SELECT  
       t.TBarcode, t.PlateNo, t.DelEcode
       datediff(MINUTE, t.PayDate,
             CASE t.Status
                WHEN 3 THEN GETDATE()
                WHEN 4 THEN t.KeyRoomDate
             END) as KRRT,
       datediff(MINUTE,t.PayDate,
             CASE t.Status
                WHEN 5 THEN t.DelDate
             END) as DT
   FROM    
       dbo.Transaction_tbl t
   WHERE   
       ([status] IN (3,4) AND locid = @locid AND dtime >= @TodayMinus7Days)
       OR 
       ([status] = 5 AND DATEDIFF(n, CAST(DelDate AS DATETIME), GETDATE()) <= 3
         AND locid = @locid AND dtime >= @TodayMinus7Days)
   ORDER BY  
       paydate
person Damien_The_Unbeliever    schedule 11.04.2014
comment
я хочу вывести вот так: tbarcode, t.plateno, t.delecode, KRRT, DT, KRRT означает, что если статус = 3, то показать разницу между датой выплаты и текущей датой, если статус = 4, то показать разницу между датой выплаты и датой ключевой комнаты ,Dt означает разницу между paydate и deldate - person user3262364; 11.04.2014
comment
@user3262364 user3262364 - обновил его до двух отдельных столбцов. - person Damien_The_Unbeliever; 11.04.2014
comment
я имею в виду, когда статус = 3 и статус = 4, тогда я хочу вернуть только один результат, который является KRRT - person user3262364; 11.04.2014
comment
@user3262364 user3262364 - у вас не может быть одиночного запроса, который выдает разные формы результатов. Количество, имя и типы столбцов, которые создает запрос, фиксированы. Кроме того, учтите, что обычно ожидается, что запрос будет возвращать несколько строк, и разные строки могут иметь разные статусы, поэтому оба столбца должны существовать. - person Damien_The_Unbeliever; 11.04.2014
comment
при выполнении этой ошибки: неправильный синтаксис рядом с ключевым словом «WHEN». Здесь это связано: datediff (MINUTE, t.PayDate, WHEN 5 THEN t.DelDate END) как DT - person user3262364; 11.04.2014
comment
@user3262364 user3262364 - извините, забыл включить строку CASE во вторую строку DATEDIFF. Помните - у меня нет вашей базы данных, поэтому я не могу проверить эти запросы. - person Damien_The_Unbeliever; 11.04.2014

alter procedure [dbo].[IBS_fetchreqVehicleinPodiumtestnew1]
   @locid INTEGER = NULL
AS BEGIN
   SET NOCOUNT ON

   DECLARE @TodayMinus7Days DATETIME
   SET @TodayMinus7Days = getdate()-7

   SELECT  
       t.TBarcode, t.PlateNo, t.DelEcode
       ,case 
            when t.status=3 then datediff(MINUTE, t.PayDate, GETDATE())
        when t.status=4 then datediff(MINUTE, t.PayDate, t.t.KeyRoomDate)
        else null
    end AS krrt
    , case
        when t.status=5 then datediff(minute,t.paydate,t.Deldate)
        else null
    end as DT
   FROM    
   dbo.Transaction_tbl t
   WHERE   
   ([status] IN (3,4) AND locid = @locid AND dtime >= @TodayMinus7Days)
   OR 
   ([status] = 5 AND DATEDIFF(n, CAST(DelDate AS DATETIME), GETDATE()) <= 3 AND locid = @locid AND dtime >= @TodayMinus7Days)
   ORDER BY  
   paydate

КОНЕЦ

person Anthony Horne    schedule 11.04.2014