J'ai cette question
SELECT
[MsgNumber], [StateAfter],
DATETIMEFROMPARTS (SUBSTRING([TimeString], 7, 4),
SUBSTRING([TimeString], 4, 2),
SUBSTRING([TimeString], 1, 2),
SUBSTRING([TimeString], 12, 2),
SUBSTRING([TimeString], 15, 2),
SUBSTRING([TimeString], 18, 2), 0) AS dt
FROM
TABLE
WHERE
[MsgNumber] IN (5, 9, 13, 17)
ORDER BY
dt ASC, StateAfter ASC
SORTIE (ok):
+-----------+-----------+-------------------------+
| MsgNumber | tateAfter | dt |
+-----------+-----------+-------------------------+
| 9 | 1 | 2018-03-09 17:22:00.000 |
| 9 | 0 | 2018-03-09 17:23:37.000 |
| 17 | 1 | 2018-03-09 17:23:37.000 |
| 17 | 1 | 2018-03-09 17:29:43.000 |
| 17 | 1 | 2018-03-09 17:36:21.000 |
+-----------+-----------+-------------------------+
Je veux ajouter une condition sur la date; pour éviter une erreur dans le codage datetime interne, j'utilise la fonction DATETIMEFROMPARTS comme ça
SELECT [MsgNumber],[StateAfter]
,DATETIMEFROMPARTS ( SUBSTRING ( [TimeString] ,7 , 4 ), SUBSTRING ( [TimeString] ,4 , 2 ), SUBSTRING ( [TimeString] ,1 , 2 ),
SUBSTRING ( [TimeString] ,12 , 2 ), SUBSTRING ( [TimeString] ,15 , 2 ), SUBSTRING ( [TimeString] ,18 , 2 ) , 0) as dt
FROM TABLE
WHERE [MsgNumber] IN (5,9,13,17) AND (dt > DATETIMEFROMPARTS(2018,4,9,0,0,0,0) and dt < DATETIMEFROMPARTS(2018,5,9,0,0,0,0))
ORDER BY dt ASC,StateAfter ASC
ERREUR:-
Msg 207, niveau 16, état 1, ligne 5
Nom de colonne non valide 'dt'.
Msg 207, niveau 16, état 1, ligne 5
Nom de colonne non valide 'dt'.
Quelqu'un peut-il m'aider à comprendre pourquoi cela ne fonctionne pas? J'ai essayé aussi la clause BETWEEN; Merci
Vous ne pouvez pas faire référence à un alias de colonne dans la where
clause. Les solutions typiques consistent à utiliser des sous-requêtes ou des CTE. Mais SQL Server a une autre méthode que je l' aime, apply
:
SELECT [MsgNumber], [StateAfter], v.dt
FROM TABLE t CROSS APPLY
(VALUES (DATETIMEFROMPARTS(SUBSTRING ([TimeString], 7, 4), SUBSTRING([TimeString], 4, 2), SUBSTRING([TimeString], 1, 2),
SUBSTRING([TimeString], 12, 2), SUBSTRING( [TimeString], 15, 2), SUBSTRING([TimeString], 18, 2), 0)
)
) V(dt)
WHERE [MsgNumber] IN (5, 9, 13, 17) AND
v.dt > DATETIMEFROMPARTS(2018, 4, 9, 0, 0, 0, 0) AND
v.dt < DATETIMEFROMPARTS(2018, 5, 9, 0, 0, 0, 0))
ORDER BY dt ASC,StateAfter ASC;
Je trouve curieux que vous n'utilisiez pas le plus simple:
WHERE [MsgNumber] IN (5, 9, 13, 17) AND
v.dt > '20180409' AND
v.dt < '20180509'
(Je n'ai pas utilisé de tirets car ce format sera toujours interprété comme AAAAMMJJ quels que soient les paramètres d'internationalisation.)
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots