J'essaie de remplir une colonne avec la date qui est le premier du mois avant une date donnée

C'est-à-dire si la date de la première colonne est le 25/01/2017, je veux que la date de la deuxième colonne se lise 01/12/2016

Jusqu'à présent, j'ai réussi à prendre un mois de congé ou à le réinitialiser au premier du mois, mais je ne parviens pas à trouver un moyen de combiner les deux. Est-ce possible, ou dois-je le faire dans deux déclarations différentes. Voici ce que j'ai jusqu'à présent:

 SELECT 
    PAY_START_DATE,
    DATEADD(MONTH, -1, CONVERT(DATE,PAY_START_DATE)) AS AMMENDONE,
    DATEADD(m, DATEDIFF(m, 0, PAY_START_DATE), 0) AS AMMENDTWO
FROM [hronline_iTrent].[iTrent].[Payroll]

Et cela donne la sortie:

PAY_START_DATE | AMMENDONE | AMMENDTWO
2016-04-06     |06/03/2016 | 01/04/2016 00:00
2016-06-12     |12/05/2016 | 01/06/2016 00:00

Toute chance que je puisse combiner les deux afin que je puisse obtenir une sortie comme:

PAY_START_DATE | AMMEND
2016-04-06     | 2016-03-01
2016-06-12     | 2016-05-01

(Le format de la sortie n'est pas important)

1
GiANTOnFire 25 janv. 2017 à 14:42

4 réponses

Meilleure réponse
SELECT DATEADD(month,-1,DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)) AS StartOfMonth
0
LS_85 25 janv. 2017 à 11:45

Vous pouvez le faire avec une seule paire DATEADD / DATEDIFF, tant que cela ne vous dérange pas que ce soit un peu mignon:

SELECT DATEADD(month,DATEDIFF(month,'20010101',PAY_START_DATE),'20001201')

Il utilise le fait que nous choisissons deux dates arbitraires qui ont déjà la relation requise entre elles que vous souhaitez atteindre - c.-à-d. 20001201 est le premier du mois précédant 20010101.

0
Damien_The_Unbeliever 25 janv. 2017 à 11:48

Essayez la requête ci-dessous,

SELECT  PAY_START_DATE
        ,DATEADD(DAY,1, DATEADD(MONTH,-2,EOMONTH(PAY_START_DATE)))
FROM    [hronline_iTrent].[iTrent].[Payroll]
1
Abdul Rasheed 25 janv. 2017 à 11:47

Voici une méthode:

select dateadd(month, -1,
               dateadd(day, 1 - day(PAY_START_DATE), PAY_START_DATE)
              )

L'intérieur dateadd() obtient le premier jour du mois. L'extérieur soustrait un mois.

0
Gordon Linoff 25 janv. 2017 à 11:45