Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Exemplos de conversão de 'smalldatetime' para 'datetime' no SQL Server (T-SQL)


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.