2013-08-01 8 views
11

Sto cercando di ottenere il codice seguente per funzionare, singolarmente i due pezzi di codice (nella parte WHEN e nella parte ELSE) funzionano ma se utilizzati in questo CASE Ho ricevuto un erroreSQL, sintassi errata sull'istruzione CASE accanto alla parola chiave 'FROM'

"Sintassi non corretta vicino a" CAST ", attesa" AS "." errore.

In sostanza se il codice WHEN affermazioni è uguale o superiore a 24 quindi utilizzare l'istruzione THEN se è sotto 24 quindi utilizzare l'istruzione ELSE.

Non riesco a farlo funzionare dopo aver provato per diverse ore qualsiasi indicazione su dove sto andando male sarebbe molto apprezzato.

SELECT CASE 
     WHEN 
      (convert(float,datediff(mi, start_work, end_work))/60) >= '24' 
     THEN 
      (convert(float,datediff(mi, start_work, end_work))/60) 
     ELSE 
      (CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 
      * 60 + RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114), 
      CASE WHEN CHARINDEX(':',convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0 
      THEN LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))-3 
      ELSE LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) 
      END) AS decimal)/60 
FROM NDB.dbo.statusa 
INNER JOIN NDB.dbo.details ON statusa.vkey = details.vkey 
INNER JOIN NDB.dbo.chegu ON statusa.ckey = NDB.dbo.chegu.gkey 
WHERE start_time!= end_time AND string1 = Visit_Id and NDB.dbo.chegu.name = 'loft' 
    AS [Working] 
+0

(convertire (float, DateDiff (mi, start_work, end_work))/60)> = '24' non dovrebbe avere virgolette intorno a 24. –

risposta

14

è necessario chiudere il tuo case dichiarazione

case when ... then ... else ... end 
10

Ci dovrebbe essere un END prima che la clausola FROM e si dovrebbe anche rimuovere ( prima CAST. Funzione

2

destra() non ha un secondo parametro

RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114), 

o: vi siete persi la parentesi finale dietro AS decimale

END) AS decimal))/60 
5

Ci avevate parentesi chiusa.

SELECT CASE 
    WHEN 
     (convert(float,datediff(mi, start_work, end_work))/60) >= '24' 
    THEN 
     (convert(float,datediff(mi, start_work, end_work))/60) 
    ELSE 
     (CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 
     * 60 + RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114), 
     CASE WHEN CHARINDEX(':',convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0 
     THEN LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))-3 
     ELSE LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) 
     END) AS decimal)/60) 
5

parentesi Unclosed e una dichiarazione di caso necessario un END.

SELECT CASE 
      WHEN (convert(FLOAT, datediff(mi, start_work, end_work))/60) >= '24' 
       THEN (convert(FLOAT, datediff(mi, start_work, end_work))/60) 
      ELSE CAST(convert(VARCHAR(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) * 60 
       + RIGHT(
         convert(VARCHAR(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114), 
         CASE 
          WHEN CHARINDEX(':', convert(VARCHAR(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0 
           THEN LEN(convert(VARCHAR(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) - 3 
          ELSE LEN(convert(VARCHAR(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) 
         END 
         ) AS DECIMAL)/60 
     END 

FROM NDB.dbo.statusa 
INNER JOIN NDB.dbo.details 
    ON statusa.vkey = details.vkey 
INNER JOIN NDB.dbo.chegu 
    ON statusa.ckey = NDB.dbo.chegu.gkey 
WHERE start_time != end_time 
    AND string1 = Visit_Id 
    AND NDB.dbo.chegu.NAME = 'loft' AS [Working] 
4

Due formulazioni di base per l'espressione CASE 1) CASE semplici espressioni Una semplice espressione CASE controlla una delle espressioni contro i valori multipli. All'interno di un'istruzione SELECT, un'espressione CASE semplice consente solo un controllo di uguaglianza; nessun altro confronto è fatto. Una semplice espressione CASE opera confrontando la prima espressione con l'espressione in ogni clausola WHEN per l'equivalenza. Se queste espressioni sono equivalenti, verrà restituita l'espressione nella clausola THEN.

2) Espressioni CASE richieste Un'espressione CASE cercata consente operatori di confronto e l'uso di AND e/o OR tra ciascuna espressione booleana. L'espressione CASE semplice verifica solo valori equivalenti e non può contenere espressioni booleane. La sintassi di base per un'espressione CASE cercata è la seguente:

Per saperne di più qui: http://blog.sqlauthority.com/2007/04/14/sql-server-case-statementexpression-examples-and-explanation/

2

Ecco la versione corretta del codice:

SELECT CASE 
     WHEN 
      (convert(float,datediff(mi, start_work, end_work))/60) >= '24' 
     THEN 
      (convert(float,datediff(mi, start_work, end_work))/60) 
     ELSE 
      (CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 
      * 60 + RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114), 
      CASE WHEN CHARINDEX(':',convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0 
      THEN LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))-3 
      ELSE LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) 
      END) AS decimal)/60 
     END 
AS [Working] 
FROM NDB.dbo.statusa INNER JOIN NDB.dbo.details ON statusa.vkey = details.vkey INNER JOIN NDB.dbo.chegu ON statusa.ckey = NDB.dbo.chegu.gkey WHERE start_time!= end_time AND string1 = Visit_Id and NDB.dbo.chegu.name = 'loft' 

In sostanza, si ha un END mancante nel esterna L'istruzione SELECT..CASE e l'alias di colonna selezionato [Working] sono stati erroneamente inseriti alla fine della query anziché nella clausola select della query.

4

Ci sono 2 errori nel codice.
Prima, si dispone di una parentesi aggiuntiva davanti a CAST che non è necessaria (e non è mai chiusa). Cambia

(CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 

a

CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 

Secondo: Aggiungere END alla fine della dichiarazione CASE prima della DA parola chiave (come @gefei sottolinea sopra pure). Il tuo codice finale dovrebbe essere simile alla seguente:

SELECT CASE 
     WHEN 
      (convert(float,datediff(mi, start_work, end_work))/60) >= '24' 
     THEN 
      (convert(float,datediff(mi, start_work, end_work))/60) 
     ELSE 
      CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 
      * 60 + RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114), 
      CASE WHEN CHARINDEX(':',convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0 
      THEN LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))-3 
      ELSE LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) 
      END) AS decimal)/60 
     END 
FROM NDB.dbo.statusa 
INNER JOIN NDB.dbo.details ON statusa.vkey = details.vkey 
INNER JOIN NDB.dbo.chegu ON statusa.ckey = NDB.dbo.chegu.gkey 
WHERE start_time!= end_time AND string1 = Visit_Id and NDB.dbo.chegu.name = 'loft' 
    AS [Working] 
5

ho capito questa risposta è troppo tardi per la ricompensa. Ma la tua sceneggiatura è troppo lunga. Questo farà esattamente lo stesso che si sta cercando di ottenere, fissando l'errore nel codice, è solo l'applicazione di patch cattivo codice:

SELECT 
    datediff(mi, 0, end_time - start_time)/60.0%24 
FROM 
.... 
Problemi correlati