Procédure stockée, renvoie startdate au début du mois

Je suis relativement nouveau dans SQL, mais je cherche à éditer une procédure stockée que nous avons afin que nous n'ayons pas besoin d'entrer manuellement les valeurs @StartDate et @EndDate. Le code est ci-dessous. Fondamentalement, j'aimerais que le StartDate soit le début du mois précédent et que EndDate soit la date actuelle. Cela pourrait être assez simple, mais je ne trouve rien en ligne qui semble se rapporter à notre problème.

USE [OnlineOrdering] GO DECLARE @return_value int EXEC @return_value = [dbo].[usp_GetPayPalOrders] @StartDate = N'2017-01-01 00:00:00', @EndDate = N'2017-01-31 23:59:59' SELECT 'Return Value' = @return_value GO 

Juste pour noter, je n'ai pas écrit cette procédure à l'origine, je voudrais juste être en mesure d'automatiser les dates pour le rendre plus facile à exécuter.

Je vous remercie

Pour get le premier jour du mois dernier, vous faites ceci:

SELECT DATEADD (mois, -1, DATEADD (mm, DATEDIFF (m, 0, GETDATE ()), 0))

Donc, votre code serait:

 USE [OnlineOrdering] GO DECLARE @firstDayLastMonth datetime = DATEADD(month,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0)), @now datetime = GETDATE() DECLARE @return_value int EXEC @return_value = [dbo].[usp_GetPayPalOrders] @StartDate = @firstDayLastMonth, @EndDate = @now SELECT 'Return Value' = @return_value GO 

Vous pouvez get le dernier jour du mois pour un jour spécifique avec EOMONTH , par exemple:

 SELECT EOMONTH(GETDATE()) 

Nous reviendrons 2017-05-31 .

La fonction accepte un décalage de mois en tant que deuxième paramètre. Vous pouvez get le dernier jour du mois précédent avec:

 SELECT EOMONTH(GETDATE(),-1) 

EOMONTH est disponible dans toutes les versions de SQL Server sockets en charge, à savoir 2012 et ultérieur.

Dans votre cas, vous pourriez écrire:

 declare @start date EOMONTH(GetDate(),-1), @end date = GetDate() EXEC @return_value = [dbo].[usp_GetPayPalOrders] @start, @end 

Cela fonctionnera si les dates sont stockées en tant que … dates, c'est-à-dire en utilisant le type de date ou le datetime sans composant de time. Sinon, vous devrez append un décalage temporel à @end, par exemple:

 declare @start date=getdate(), @endDay datetime=cast(getdate() as date) declare @end datetime = @endDay + cast('23:59:59' as datetime)