Cast / converter nvarchar em datetime

Oct 01 2020

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

1 Larnu Oct 01 2020 at 12:03

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.

2 GordonLinoff Oct 01 2020 at 11:57

Você pode explicitamente converter para um datetimeusando convert()formato de 104:

select convert(datetime, '31.10.2020 16:32:11', 104)