Si vous êtes sûr que votre format est cohérent, vous pouvez simplement prendre ce tiret (j'ai utilisé datetime à des fins d'illustration);
CONVERT(DATETIME, REPLACE('20161021-12:55:16.000','-',' '), 102)
Résultat
2016-10-21 12:55:16.000
Pour la conversion, vous pouvez convertir en datetime, prenez vos heures puis convertir au format de date que vous voulez;
CONVERT(DATETIME, DATEADD(hh,-5,CONVERT(DATETIME,REPLACE('20161021-12:55:16.000','-',' '))), 102)
Résultat;
2016-10-21 07:55:16.000
Pour avoir une meilleure idée de ce fait, mis en avant cinq heures et vous obtiendrez la veille;
CONVERT(DATETIME, DATEADD(hh,-5,CONVERT(DATETIME,REPLACE('20161021-04:55:16.000','-',' '))), 102)
Résultat
2016-10-20 23:55:16.000
Pour référence, sur mes systèmes de test que vous n'avez pas besoin de se convertir à 102, qui est la valeur par défaut.
DATEADD(hh,-5,CONVERT(DATETIME,REPLACE('20161021-04:55:16.000','-',' ')))
Pour obtenir la différence de temps dynamiquement, faites quelque chose comme ceci;
DATEADD(hh,DATEDIFF(hh,GETUTCDATE(),GETDATE()),CONVERT(DATETIME,REPLACE('20161021-04:55:16.000','-',' ')))
__gVirt_NP_NN_NNPS<__ numéro de format incorrect. Regardez la liste [ici] (https://www.techonthenet.com/sql_server/functions/convert.php) – JohnHC