web-dev-qa-db-fra.com

Comment créer une date dans SQL Server avec le jour, le mois et l'année sous forme d'entiers

POUR Exemple si j'ai: 

DECLARE @Day int = 25
DECLARE @Month int  = 10 
DECLARE @Year int = 2016

Je veux retourner

2016-10-25

Comme date ou date/heure

18
MswatiLomnyama

Dans SQL Server 2012+, vous pouvez utiliser datefromparts():

select datefromparts(@year, @month, @day)

Dans les versions antérieures, vous pouvez convertir une chaîne. Voici une méthode:

select cast(cast(@year*10000 + @month*100 + @day as varchar(255)) as date)
43
Gordon Linoff

Dans SQL Server 2012+, vous pouvez utiliser DATEFROMPARTS ():

DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT DATEFROMPARTS (@Year, @Month, @Day);

Dans les versions antérieures, une méthode consiste à créer et à convertir une chaîne.

Il existe quelques formats de date de chaîne que SQL Server interprète de manière fiable, quels que soient la date, la langue ou les paramètres d'internationalisation.

Une chaîne de six ou huit chiffres est toujours interprétée comme ymd. Le mois et le jour doit toujours être deux chiffres.

https://docs.Microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql

Ainsi, une chaîne au format "aaaammjjd" sera toujours correctement interprétée.

(ISO 8601 - YYYY-MM-DDThh:mm:ss-- fonctionne également, mais vous devez spécifier l'heure et par conséquent, c'est plus compliqué que nécessaire.)

Alors que vous pouvez simplement CAST cette chaîne comme une date, vous devez utiliser CONVERT afin de spécifier un style, et vous devez spécifier un style pour être déterministe (si cela vous importe).

Le format "aaaammjj" correspond au style 112, donc votre conversion ressemble à ceci:

DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);

Et il en résulte:

2016-10-25

Techniquement, le format ISO/112/aaaammjj fonctionne même avec les autres styles spécifiés. Par exemple, en utilisant ce format de texte avec le style 104 (allemand, jj.mm.aaaa):

DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),104);

Il en résulte toujours aussi:

2016-10-25

Les autres formats ne sont pas aussi robustes. Par exemple ceci:

SELECT CASE WHEN CONVERT(date,'01-02-1900',110) = CONVERT(date,'01-02-1900',105) THEN 1 ELSE 0 END;

Résulte en:

Remarque: avec cette méthode, prenez garde que des entrées non-sens peuvent générer des dates valides mais incorrectes:

DECLARE @Year int = 2016, @Month int = 0, @Day int = 1025;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);

Donne aussi:

2016-10-25

DATEFROMPARTS vous protège des entrées non valides. Ce:

DECLARE @Year int = 2016, @Month int = 10, @Day int = 32;
SELECT DATEFROMPARTS (@Year, @Month, @Day);

Rendements:

Msg 289, Niveau 16, État 1, Ligne 2 Impossible de construire le type de données date, certains des arguments ont des valeurs qui ne sont pas valides.

Notez également que cette méthode ne fonctionne pas pour les dates antérieures à 1000-01-01. Par exemple:

DECLARE @Year int = 900, @Month int = 1, @Day int = 1;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);

Rendements:

Msg 241, Niveau 16, État 1, Ligne 2 La conversion a échoué lors de la conversion date et/ou heure de la chaîne de caractères.

En effet, la chaîne résultante, "9000101", n'est pas au format "aaaammjj". Pour garantir un formatage correct, vous devez le compléter avec des zéros non significatifs, au détriment de quelques performances. Par exemple:

DECLARE @Year int = 900, @Month int = 1, @Day int = 1;
SELECT CONVERT(date,RIGHT('000' + CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),8),112);

Résulte en:

0900-01-01

Il existe d'autres méthodes en dehors de la conversion de chaîne. Plusieurs sont fournis dans les réponses à " Créer une date avec T-SQL ". Un exemple notable implique la création de la date en ajoutant des années, des mois et des jours à la "date zéro".

(Cette réponse est inspirée de Gordon Linoffanswer , que j'ai développé et fourni des documents et des notes supplémentaires.)

2
Riley Major

Donc, vous pouvez essayer cette solution:

DECLARE @DAY INT = 25
DECLARE @MONTH INT  = 10 
DECLARE @YEAR INT = 2016
DECLARE @DATE AS DATETIME

SET @DATE = CAST(RTRIM(@YEAR * 10000 + @MONTH * 100 + @DAY) AS DATETIME) 

SELECT REPLACE(CONVERT(VARCHAR(10), @DATE, 102), '.', '-') AS EXPECTDATE

Ou vous pouvez essayer ceci quelques lignes de code:

DECLARE @DAY INT = 25
DECLARE @MONTH INT  = 10 
DECLARE @YEAR INT = 2016

SELECT CAST(RTRIM(@YEAR * 10000 +'-' +  @MONTH * 100+ '-' + @DAY) AS DATE) AS EXPECTDATE
0
Muriel Souza

select convert (varchar (11), transfer_date, 106) 

m'a obtenu mon résultat souhaité de date au 07 mars 2018

Ma colonne 'transfer_date' est une colonne de type date-heure et j'utilise SQL Server 2017 sur Azure.

0