Este artigo contém exemplos de conversão de um smalldatetime valor para um datetime valor no SQL Server.
Quando você converte uma pequena data e hora valor para datetime , as horas e os minutos são copiados e os segundos e os segundos fracionários são definidos como
0
. Exemplo 1 – Conversão explícita usando CAST()
Aqui está um exemplo de uma conversão explícita. Neste caso, eu uso o
CAST()
função diretamente dentro do SELECT
instrução para converter explicitamente de smalldatetime para datahora . DECLARE @thesmalldatetime smalldatetime SET @thesmalldatetime = '2031-03-25 11:15:29' SELECT @thesmalldatetime AS 'thesmalldatetime', CAST(@thesmalldatetime AS datetime) AS 'datetime';
Resultado:
+---------------------+-------------------------+ | thesmalldatetime | datetime | |---------------------+-------------------------| | 2031-03-25 11:15:00 | 2031-03-25 11:15:00.000 | +---------------------+-------------------------+
Em primeiro lugar, podemos ver que o thesmalldatetime valor usa
00
para o componente de segundos, mesmo que o tenhamos definido explicitamente em 29
. Isso ocorre porque ao usar o thesmalldatetime tipo de dados, os segundos são sempre zero (e sem segundos fracionários). Portanto, quando convertemos o valor para datetime , o valor de segundos (e segundos fracionários) são definidos como zero. Acabamos de atribuir o valor original a datetime em primeiro lugar, os segundos teriam permanecido intactos:
DECLARE @thedatetime datetime SET @thedatetime = '2031-03-25 11:15:29' SELECT @thedatetime AS 'thedatetime';
Resultado:
+-------------------------+ | thedatetime | |-------------------------| | 2031-03-25 11:15:29.000 | +-------------------------+
Não apenas os segundos permaneceriam intactos, mas também quaisquer segundos fracionários permaneceriam intactos (mas apenas até uma escala de 3):
DECLARE @thedatetime datetime SET @thedatetime = '2031-03-25 11:15:29.123' SELECT @thedatetime AS 'thedatetime';
Resultado:
+-------------------------+ | thedatetime | |-------------------------| | 2031-03-25 11:15:29.123 | +-------------------------+
Exemplo 2 – Arredondamento
Veja o que acontece se definirmos o componente de segundos para um valor mais alto antes de atribuí-lo ao smalldatetime tipo de dados.
DECLARE @thesmalldatetime smalldatetime SET @thesmalldatetime = '2031-03-25 11:15:31' SELECT @thesmalldatetime AS 'thesmalldatetime', CAST(@thesmalldatetime AS datetime) AS 'datetime';
Resultado:
+---------------------+-------------------------+ | thesmalldatetime | datetime | |---------------------+-------------------------| | 2031-03-25 11:16:00 | 2031-03-25 11:16:00.000 | +---------------------+-------------------------+
Portanto, o componente de minutos agora é arredondado para o próximo minuto.
Exemplo 3 – Conversão explícita usando CONVERT()
Este é o mesmo que o primeiro exemplo, exceto que desta vez eu uso o
CONVERT()
função em vez de CAST()
. DECLARE @thesmalldatetime smalldatetime SET @thesmalldatetime = '2031-03-25 11:15:29' SELECT @thesmalldatetime AS 'thesmalldatetime', CONVERT(datetime, @thesmalldatetime) AS 'datetime';
Resultado:
+---------------------+-------------------------+ | thesmalldatetime | datetime | |---------------------+-------------------------| | 2031-03-25 11:15:00 | 2031-03-25 11:15:00.000 | +---------------------+-------------------------+
Exemplo 4 – Conversão implícita
Aqui está um exemplo de como fazer a mesma coisa, mas usando uma conversão de tipo implícita.
DECLARE @thesmalldatetime smalldatetime, @thedatetime datetime SET @thesmalldatetime = '2031-03-25 11:15:29' SET @thedatetime = @thesmalldatetime SELECT @thesmalldatetime AS 'thesmalldatetime', @thedatetime AS 'datetime';
Resultado:
+---------------------+-------------------------+ | thesmalldatetime | datetime | |---------------------+-------------------------| | 2031-03-25 11:15:00 | 2031-03-25 11:15:00.000 | +---------------------+-------------------------+
Assim, obtemos o mesmo resultado, independentemente de ser uma conversão explícita ou implícita.
Esta é uma conversão implícita porque não estamos usando uma função de conversão para convertê-la explicitamente. Estamos simplesmente atribuindo o valor de uma variável de um tipo de dados a uma variável de outro tipo de dados. Nesse caso, o SQL Server executa uma conversão implícita nos bastidores quando tentamos atribuir o smalldatetime valor para um datetime variável.