Principale utente con più risposte
Query con CASE WHEN

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
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 trovoVorrei 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
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' -
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?
-
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 restituisceDopo aggiungi un WHERE per volta
-
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
-
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 trovoVorrei 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
-