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

Converter 'time' para 'smalldatetime' no SQL Server (Exemplos de T-SQL)


Este artigo contém exemplos de conversão de um tempo valor para um smalldatetime valor no SQL Server.

Quando você converte um tempo valor para smalldatetime , a data é definida como '1900-01-01' e os valores de hora e minuto são arredondados para cima. Os segundos e 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 tempo para pequena data e hora .
DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Resultado:
+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Portanto, uma parte de data é adicionada e definida como '1900-01-01' e, neste caso, os valores dos minutos são arredondados e os segundos definidos como 0.

A documentação da Microsoft afirma que os segundos fracionários também são definidos como zero, mas o smalldatetime tipo de dados não inclui segundos fracionários de qualquer maneira.

A propósito, sempre que você usar o smalldatetime tipo de dados, o componente de segundos é sempre definido como 0.

Exemplo 2 – Arredondando a hora


Aqui está um exemplo da hora sendo arredondada:
DECLARE @thetime time(0);
SET @thetime = '10:59:59';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Resultado:
+----------+---------------------+
| time     | smalldatetime       |
|----------+---------------------|
| 10:59:59 | 1900-01-01 11:00:00 |
+----------+---------------------+

Nesse caso, também especifiquei uma escala de 0 para o valor de tempo, no entanto, isso não afeta o resultado.

Só para ficar claro, escala é o número de dígitos à direita do ponto decimal em um número. Precisão é o número total de dígitos no número. Quando especificamos uma escala de 0, significa que a parte fracionária não está incluída.

Exemplo 3 – Conversão explícita usando CONVERT()


Aqui está um exemplo usando o CONVERT() função em vez de CAST() .
DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CONVERT(smalldatetime, @thetime) AS 'smalldatetime';

Resultado:
+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

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 @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Resultado:
+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

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 realiza uma conversão implícita nos bastidores quando tentamos atribuir o tempo valor para um smalldatetime variável.

Exemplo 5 – Alterar a data


Se você precisar alterar a data (mas manter a mesma hora), você pode usar o DATEADD() função.
DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Resultado:
+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1985-01-01 23:16:00 |
+------------------+---------------------+

Neste caso, acrescento 85 ao valor do ano, o que o leva a 1985.

No entanto, esteja ciente de que smalldatetime suporta um intervalo de datas muito estreito (1900-01-01 a 2079-06-06), portanto, adicionar muito ao ano pode resultar em um erro de estouro como o abaixo:
DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Resultado:
Adding a value to a 'smalldatetime' column caused an overflow.