none
Query con CASE WHEN RRS feed

  • Domanda

  • Scusate non capisco perchè questa query:

    SELECT CodCantina, CodRecipiente, CodiceBarrique, DataPrimoMov, OraPrimoMov, DataUltimoMov, OraUltimoMov, ([DataPrimoMov] + ' ' + [OraPrimoMov]) AS PrimoMovimento, ([DataUltimoMov] + ' '  + [OraUltimoMov]) AS UltimoMovimento, (CASE WHEN IsDate([DataUltimoMov]) = 1 THEN   ([DataUltimoMov] + ' '  + [OraUltimoMov])ELSE   Null END) AS DataOraUltimoM  FROM SaldiStorico WHERE CodCantina = '01' AND CodRecipiente = '138' AND CodiceBarrique = '@@@@' AND ([DataPrimoMov] + ' ' + [OraPrimoMov]) <= '14/06/12 08:11:32' AND DataOraUltimoM  >= '14/06/12 08:11:32'

    Mi dia l'errore: "Il nome di colonna 'DataOraUltimoM' non è valido"

    Grazie Mille

    venerdì 29 giugno 2012 08:42

Risposte

  • Allora:

    ________________________________________________

    DataPrimoMov   e  OraPrimoMov   desumo dal loro
    valore ( 2007-11-26 00:00:00.000  )
    che sono in formato datetime  Giusto ?

    ________________________________________________

    Quella data strana  ( 30/12/1899 ) mi ricorda
    l'inizio del calendario di Access  Giusto ?

    _______________________________________________________


    SQLServer le date le esprime in forma  "2007-11-26 00:00:00.000"

    Tu invece le vuoi in forma "26/11/2012 11:59:10"


    Di solito questa variazione di formato si fa nella applicazione


    Ma nel DB con le tue premesse mi torna difficile anche
    sommare il valore della data al valore dell'ora del 1899


    _________________________________________________________

    Alla fine ho rappezzato il tutto con due lunghe funzioni che:

    ___ Trasformando i singoli elementi in stringa ti danno
    il formato che vuoi te  ( 26/11/2012 11:59:10 )
    Chiaramente in formato stringa


    ___ Partendo da quel risultato lo Ritrasformo in DateTime
    ( 2012-11-26 11:59:10.000  ) perche ritengo ti sia piu utile


    _______________________________________________________________

    Certamente ci sono soluzioni piu semplici ma al momento
    non ne trovo

       Vorrei che qualcuno piu esperto di me ci indicasse una strada migliore

    Prova a lanciare lo script sottostante ( SQLServer2008R2)

    -- Creazione semplificata di un nuovo DB CREATE DATABASE fxx; GO -- Uso il DB appena creato USE fxx; GO -- Creo di tabelle CREATE TABLE [dbo].[Tab] ( [Tim7] [time](7) NULL, [Datx] [date] NULL, [SmalDT] [smalldatetime] NULL, [DataT] [datetime] NULL, [DatT27] [datetime2](7) NULL, [DataPrimoMov] [datetime] NULL, [OraPrimoMov] [datetime] NULL, [Id] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY] GO -- Inseriamo un po' di dati INSERT [dbo].[Tab] ([Tim7], [Datx], [SmalDT], [DataT], [DatT27], [DataPrimoMov], [OraPrimoMov]) VALUES (CAST(0x0700AC5264600000 AS Time), CAST(0x40350B00 AS Date), CAST(0x9FE50000 AS SmallDateTime), CAST(0x00009FE500000000 AS DateTime), CAST(0x07000000000040350B AS DateTime2), CAST(0x0000A13100000000 AS DateTime), CAST(0xFFFFFFFE00C52FB0 AS DateTime)) INSERT [dbo].[Tab] ([Tim7], [Datx], [SmalDT], [DataT], [DatT27], [DataPrimoMov], [OraPrimoMov]) VALUES (NULL, NULL, NULL, NULL, NULL, CAST(0x00009FCB00000000 AS DateTime), CAST(0xFFFFFE9300126CCC AS DateTime)) GO -- Creo una vista CREATE VIEW [dbo].[Vista] AS SELECT DataPrimoMov, OraPrimoMov, RIGHT('0' + CAST(DAY(DataPrimoMov) AS varchar), 2) + '/' + RIGHT('0' + CAST(MONTH(DataPrimoMov) AS varchar), 2) + '/' + CAST(YEAR(DataPrimoMov) AS varchar) + ' ' + RIGHT('0' + CAST({ fn HOUR(OraPrimoMov) } AS varchar), 2) + ':' + RIGHT('0' + CAST({ fn MINUTE(OraPrimoMov) } AS varchar), 2) + ':' + RIGHT('0' + CAST({ fn SECOND(OraPrimoMov) } AS varchar), 2) AS FormatoTesto, CAST ( RIGHT('0' + CAST(DAY(DataPrimoMov) AS varchar), 2) + '/' + RIGHT('0' + CAST(MONTH(DataPrimoMov) AS varchar), 2) + '/' + CAST(YEAR(DataPrimoMov) AS varchar) + ' ' + RIGHT('0' + CAST({ fn HOUR(OraPrimoMov) } AS varchar), 2) + ':' + RIGHT('0' + CAST({ fn MINUTE(OraPrimoMov) } AS varchar), 2) + ':' + RIGHT('0' + CAST({ fn SECOND(OraPrimoMov) } AS varchar), 2) AS datetime) AS FormatoDateTime FROM dbo.Tab GO -- Finito ________________________________________

    -- ____________________________________________


    Facci Sapere




    • Modificato Mancini, lunedì 2 luglio 2012 20:58
    • Contrassegnato come risposta Marco Bruni Sbt martedì 3 luglio 2012 09:05
    lunedì 2 luglio 2012 20:49

Tutte le risposte

  • SELECT

    .........
    (CASE WHEN IsDate([DataUltimoMov]) = 1 THEN   ([DataUltimoMov] + ' '  + [OraUltimoMov])ELSE   Null END) AS DataOraUltimoM  

    FROM

    SaldiStorico

    WHERE

    ......
    AND
    DataOraUltimoM  >= '14/06/12 08:11:32'

    Mi dia l'errore: "Il nome di colonna 'DataOraUltimoM' non è valido"

    In questo momento Non ho nulla per testare la risposta,

     

    Ma direi che:

    'DataOraUltimoM'  non è un campo di origine  della query
    bensi il nome che tu dai alla formula

    ... (CASE WHEN IsDate([DataUltimoMov]) = 1 THEN   ([DataUltimoMov] + ' '  + [OraUltimoMov])ELSE   Null END) AS DataOraUltimoM ...

     

     

    _____________________________________________________________________


    pertanto nella WHERE non puoi usare
    DataOraUltimoM >= .......
    ma devi usare
    (CASE WHEN IsDate([DataUltimoMov]) = 1 THEN   ([DataUltimoMov] + ' '  + [OraUltimoMov])ELSE   Null END) >= ........


    _________________________________________________________________________

    Il risultato pertanto sarà:

    SELECT
      CodCantina,
      CodRecipiente,
      CodiceBarrique,
      DataPrimoMov,
      OraPrimoMov,
      DataUltimoMov,
      OraUltimoMov,
      ([DataPrimoMov] + ' ' + [OraPrimoMov]) AS PrimoMovimento,
      ([DataUltimoMov] + ' '  + [OraUltimoMov]) AS UltimoMovimento,
      (CASE WHEN IsDate([DataUltimoMov]) = 1 THEN   ([DataUltimoMov] + ' '  + [OraUltimoMov])ELSE   Null END) AS DataOraUltimoM 
    FROM
      SaldiStorico
    WHERE
      CodCantina = '01'
      AND
      CodRecipiente = '138'
      AND
      CodiceBarrique = '@@@@'
      AND
      ([DataPrimoMov] + ' ' + [OraPrimoMov]) <= '14/06/12 08:11:32'
      AND
      (CASE WHEN IsDate([DataUltimoMov]) = 1 THEN   ([DataUltimoMov] + ' '  + [OraUltimoMov])ELSE   Null END)  >= '14/06/12 08:11:32'

     

    venerdì 29 giugno 2012 13:28
  • Diciamo che così non dà errore ma non funziona, adesso ho cambiato strategia ho provato con:

    SELECT 
      CodCantina, 
      CodRecipiente, 
      CodiceBarrique, 
      DataPrimoMov, 
      OraPrimoMov, 
      DataUltimoMov, 
      OraUltimoMov, 
     (CONVERT(varchar(23), DataPrimoMov,105) + ' ' 
       + SUBSTRING(CONVERT(varchar(23), OraPrimoMov,121),12,8))
       as PrimoMovimento,
        (CONVERT(varchar(23), DataUltimoMov,105) + ' ' 
       + SUBSTRING(CONVERT(varchar(23), OraUltimoMov,121),12,8))
     as UltimoMovimento
    FROM 
      SaldiStorico 
    WHERE 
      CodCantina = '01' 
      AND 
      CodRecipiente = '138' 
      AND 
      CodiceBarrique = '@@@@' 

    Non capisco se scrivo nel WHERE ancora AND PrimoMovimento mi dice che non è un nome valido ma perchè se l'ho creato io?

    venerdì 29 giugno 2012 15:30
  • Non capisco se scrivo nel WHERE ancora AND PrimoMovimento mi dice che non è un nome valido ma perchè se l'ho creato io?

    Perche SQL fa il prezioso  ( come le donne )

    ____________________________________________

    Se tu nella query ti crei per esempio

    __ A + B  AS C

    _________________________________________

    Dopo non puoi scrivere

    __ WHERE C = 12

    ma devi scrivere

    __ WHERE A + B = 12

    ________________________________________________________________________________
    ________________________________________________________________________________
    ________________________________________________________________________________

    Invece per il mancato funzionamento   che lamenti
    io comincerei a togliere tutti i WHERE e vedi cosa
    ti restituisce

    Dopo aggiungi un WHERE per volta

    venerdì 29 giugno 2012 16:11
  • Capito, ma non riesco lo stesso ad ottenere quello che vorrei con data e ora.

    Vi spiego cosa devo ottenere, prendiamo ad esempio la data e ora inferiore DataPrimoMov,e OraPrimoMov.

    In Sql Server ho questi valori ad esempio:

    ------DATAPRIMOMOV------  -----------OraPrimoMov-----

    2007-11-26 00:00:00.000 1899-12-30 11:59:10.000

    Devo fare in modo di ottenere un campo risultato con Data e Ora insieme così:

    26/11/2012 11:59:10


    lunedì 2 luglio 2012 08:24
  • Allora:

    ________________________________________________

    DataPrimoMov   e  OraPrimoMov   desumo dal loro
    valore ( 2007-11-26 00:00:00.000  )
    che sono in formato datetime  Giusto ?

    ________________________________________________

    Quella data strana  ( 30/12/1899 ) mi ricorda
    l'inizio del calendario di Access  Giusto ?

    _______________________________________________________


    SQLServer le date le esprime in forma  "2007-11-26 00:00:00.000"

    Tu invece le vuoi in forma "26/11/2012 11:59:10"


    Di solito questa variazione di formato si fa nella applicazione


    Ma nel DB con le tue premesse mi torna difficile anche
    sommare il valore della data al valore dell'ora del 1899


    _________________________________________________________

    Alla fine ho rappezzato il tutto con due lunghe funzioni che:

    ___ Trasformando i singoli elementi in stringa ti danno
    il formato che vuoi te  ( 26/11/2012 11:59:10 )
    Chiaramente in formato stringa


    ___ Partendo da quel risultato lo Ritrasformo in DateTime
    ( 2012-11-26 11:59:10.000  ) perche ritengo ti sia piu utile


    _______________________________________________________________

    Certamente ci sono soluzioni piu semplici ma al momento
    non ne trovo

       Vorrei che qualcuno piu esperto di me ci indicasse una strada migliore

    Prova a lanciare lo script sottostante ( SQLServer2008R2)

    -- Creazione semplificata di un nuovo DB CREATE DATABASE fxx; GO -- Uso il DB appena creato USE fxx; GO -- Creo di tabelle CREATE TABLE [dbo].[Tab] ( [Tim7] [time](7) NULL, [Datx] [date] NULL, [SmalDT] [smalldatetime] NULL, [DataT] [datetime] NULL, [DatT27] [datetime2](7) NULL, [DataPrimoMov] [datetime] NULL, [OraPrimoMov] [datetime] NULL, [Id] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY] GO -- Inseriamo un po' di dati INSERT [dbo].[Tab] ([Tim7], [Datx], [SmalDT], [DataT], [DatT27], [DataPrimoMov], [OraPrimoMov]) VALUES (CAST(0x0700AC5264600000 AS Time), CAST(0x40350B00 AS Date), CAST(0x9FE50000 AS SmallDateTime), CAST(0x00009FE500000000 AS DateTime), CAST(0x07000000000040350B AS DateTime2), CAST(0x0000A13100000000 AS DateTime), CAST(0xFFFFFFFE00C52FB0 AS DateTime)) INSERT [dbo].[Tab] ([Tim7], [Datx], [SmalDT], [DataT], [DatT27], [DataPrimoMov], [OraPrimoMov]) VALUES (NULL, NULL, NULL, NULL, NULL, CAST(0x00009FCB00000000 AS DateTime), CAST(0xFFFFFE9300126CCC AS DateTime)) GO -- Creo una vista CREATE VIEW [dbo].[Vista] AS SELECT DataPrimoMov, OraPrimoMov, RIGHT('0' + CAST(DAY(DataPrimoMov) AS varchar), 2) + '/' + RIGHT('0' + CAST(MONTH(DataPrimoMov) AS varchar), 2) + '/' + CAST(YEAR(DataPrimoMov) AS varchar) + ' ' + RIGHT('0' + CAST({ fn HOUR(OraPrimoMov) } AS varchar), 2) + ':' + RIGHT('0' + CAST({ fn MINUTE(OraPrimoMov) } AS varchar), 2) + ':' + RIGHT('0' + CAST({ fn SECOND(OraPrimoMov) } AS varchar), 2) AS FormatoTesto, CAST ( RIGHT('0' + CAST(DAY(DataPrimoMov) AS varchar), 2) + '/' + RIGHT('0' + CAST(MONTH(DataPrimoMov) AS varchar), 2) + '/' + CAST(YEAR(DataPrimoMov) AS varchar) + ' ' + RIGHT('0' + CAST({ fn HOUR(OraPrimoMov) } AS varchar), 2) + ':' + RIGHT('0' + CAST({ fn MINUTE(OraPrimoMov) } AS varchar), 2) + ':' + RIGHT('0' + CAST({ fn SECOND(OraPrimoMov) } AS varchar), 2) AS datetime) AS FormatoDateTime FROM dbo.Tab GO -- Finito ________________________________________

    -- ____________________________________________


    Facci Sapere




    • Modificato Mancini, lunedì 2 luglio 2012 20:58
    • Contrassegnato come risposta Marco Bruni Sbt martedì 3 luglio 2012 09:05
    lunedì 2 luglio 2012 20:49
  • Grazie Mille Renrig, grazie a te e all'ultima risposta ho risolto. 

    Altrimenti non sapevo che pesci pigliare.

    Grazie Mille

    martedì 3 luglio 2012 09:05