Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Convertir 'time' en 'smalldatetime' dans SQL Server (exemples T-SQL)

Cet article contient des exemples de conversion d'une heure valeur à un smalldatetime valeur dans SQL Server.

Lorsque vous convertissez une heure valeur à smalldatetime , la date est définie sur « 1900-01-01 » et les valeurs des heures et des minutes sont arrondies. Les secondes et les fractions de secondes sont mises à 0.

Exemple 1 - Conversion explicite à l'aide de CAST()

Voici un exemple de conversion explicite. Dans ce cas, j'utilise le CAST() fonction directement dans le SELECT déclaration pour convertir explicitement à partir de temps à smalldatetime .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Résultat :

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

Ainsi, une partie de date est ajoutée et définie sur "1900-01-01", et dans ce cas, les valeurs des minutes sont arrondies et les secondes sont définies sur 0.

La documentation Microsoft indique que les fractions de seconde sont également définies sur zéro, mais le smalldatetime le type de données n'inclut pas les fractions de secondes de toute façon.

Au fait, chaque fois que vous utilisez le smalldatetime type de données, le composant des secondes est toujours défini sur 0.

Exemple 2 - Arrondir l'heure

Voici un exemple d'heure arrondie :

DECLARE @thetime time(0);
SET @thetime = '10:59:59';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Résultat :

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

Dans ce cas, j'ai également spécifié une échelle de 0 pour la valeur temporelle, mais cela n'affecte pas le résultat.

Juste pour être clair, échelle est le nombre de chiffres à droite de la virgule décimale dans un nombre. Précision est le nombre total de chiffres du nombre. Lorsque nous spécifions une échelle de 0, cela signifie que la partie fractionnaire n'est pas incluse.

Exemple 3 - Conversion explicite à l'aide de CONVERT()

Voici un exemple utilisant le CONVERT() fonction au lieu de CAST() .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CONVERT(smalldatetime, @thetime) AS 'smalldatetime';

Résultat :

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

Exemple 4 – Conversion implicite

Voici un exemple de faire la même chose, mais en utilisant une conversion de type implicite.

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Résultat :

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

Nous obtenons donc le même résultat, qu'il s'agisse d'une conversion explicite ou implicite.

Il s'agit d'une conversion implicite car nous n'utilisons pas de fonction de conversion pour la convertir explicitement. Nous attribuons simplement la valeur d'une variable d'un type de données à une variable d'un autre type de données. Dans ce cas, SQL Server effectue une conversion implicite dans les coulisses lorsque nous essayons d'attribuer l'heure valeur à un smalldatetime variables.

Exemple 5 - Modifier la date

Si vous devez changer la date (mais garder la même heure), vous pouvez utiliser le DATEADD() une fonction.

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';

Résultat :

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

Dans ce cas, j'ajoute 85 à la valeur de l'année, ce qui l'amène à 1985.

Sachez cependant que smalldatetime prend en charge une plage de dates très étroite (1900-01-01 à 2079-06-06), donc ajouter trop à l'année pourrait entraîner une erreur de dépassement comme celle ci-dessous :

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';

Résultat :

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