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
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)
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.)
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
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.