web-dev-qa-db-fra.com

Création d'une date dans SQL Server 2008

Existe-t-il quelque chose de similaire à DATEFROMPARTS(year, month, day) dans SQL Server 2008? Je veux créer une date en utilisant l'année et le mois en cours, mais mon propre jour du mois. Cela doit être fait sur une seule ligne afin d'être utilisé dans une formule de colonne calculée.

Par exemple (je ne sais pas si cela fonctionne parce que je n'ai pas SQL Server 2012):

DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 3)

Existe-t-il un moyen de le faire dans SQL Server 2008?

DATEFROMPARTS Semble uniquement disponible dans SQL Server 2012 (lien)

19
Jaiesh_bhai

En utilisant le 3 à partir de votre exemple, vous pouvez faire ceci:

dateadd(dd, 3 -1, dateadd(mm, datediff(mm,0, current_timestamp), 0))

Il fonctionne en trouvant le nombre de mois depuis la date de l'époque, en ajoutant ces mois à la date de l'époque, puis en ajoutant le nombre de jours souhaité à ce résultat précédent. Cela semble compliqué, mais il repose sur ce qui était la manière canonique de tronquer les dates avant le type Date (pas DateTime) ajouté à Sql Server 2008.

Vous allez probablement voir d'autres réponses suggérant des chaînes de date de construction. Je vous exhorte à éviter cette technique. L'utilisation de chaînes est susceptible d'être beaucoup plus lente, et il existe des écueils potentiels avec des classements/formats de dates alternatifs.

20
Joel Coehoorn

Vous pouvez utiliser quelque chose comme ceci pour créer votre propre datetime:

DECLARE @year INT = 2012
DECLARE @month INT = 12
DECLARE @day INT = 25

SELECT CAST(CONVERT(VARCHAR, @year) + '-' + CONVERT(VARCHAR, @month) + '-' + CONVERT(VARCHAR, @day)
 AS DATETIME)
23
Ken Richards
CREATE FUNCTION  DATEFROMPARTS
(
    @year int,
    @month int,
    @day int
)
RETURNS datetime
AS
BEGIN

     declare @d datetime

     select @d =    CAST(CONVERT(VARCHAR, @year) + '-' + CONVERT(VARCHAR, @month) + '-' + CONVERT(VARCHAR, @day) AS DATETIME)
    RETURN  @d 

END
GO
4
AlejandroR