Cast / converter nvarchar em datetime
eu tenho mesa:
id timestamp
1 31.10.2020 16:32:11
2 09.09.2020 09:15:49
3 22.04.2020 02:48:15
Tabela tem grande quantidade desses dados. O carimbo de data / hora da coluna é o tipo de dados "nvarchar". E eu preciso classificar os dados por data ou usar cláusulas WHERE para restrição por data, então preciso converter "carimbo de data / hora" em data e hora. Mas não consigo. Eu tentei converter e lançar, mas ainda falhei.
Algum conselho?
THX.
Respostas
Corrija seu design e altere a coluna para um tipo de dados de data e hora. Considerando que seus dados têm precisão de 1 segundo, um datetime2(0)parece apropriado aqui. Primeiro, precisamos alterar o "formato" do nvarcharvalor para um formato ISO. Usaremos o formato ISO8601 (aaaa-mm-ddThh: mi: ss.mmm) porque não é ambíguo:
UPDATE dbo.YourTable
SET [timestamp] = CONVERT(nvarchar(20),TRY_CONVERT(datetime2(0), [timestamp], 4), 126);
Agora você pode ALTERdefinir a tabela e alterar o tipo de dados para datetime2(0):
ALTER TABLE dbo.YourTable ALTER COLUMN [timestamp] datetime2(0) NULL;
Também recomendo usar um nome diferente do que timestamppara sua coluna. timestampé um sinônimo obsoleto de rowversion, então seu uso pode torná-lo bastante confuso; especialmente porque rowversionnão é um valor de data e hora, mas um binaryvalor e não pode ser convertido em um tipo de dados de data e hora.
Você pode explicitamente converter para um datetimeusando convert()formato de 104:
select convert(datetime, '31.10.2020 16:32:11', 104)