2015-08-07 1 views
0

J'ai une procédure stockée qui s'exécute pour extraire des données pour les ventes dans un mois donné. Il ne retourne pas 31 jours sur les mois qui ont 31 jours. J'ai besoin d'aide pour comprendre la répartition de la chaîne suivanteDateadd renvoyant les mauvais jours dans le mois

(dateadd(dd,-(datepart(dd,getdate())),CONVERT(CHAR(8),GetDate(),112)))+'23:59:59') 

Je comprends que CONVERT(CHAR(8),GetDate(),112) est de prendre la date du système et la conversion en YYYYMMDD et que datepart(dd,getdate()) prend la date du système et prend seulement la partie de la journée, mais je ne peux pas déchiffrer la chaîne entière.

Répondre

0

Il y a un problème avec l'expression que vous avez donnée. La parenthèse après 23:59:59 n'a pas d'accolade ouvrante.

Cependant ce que l'expression a l'intention de faire est: (datepart(dd,getdate())) est d'obtenir le la partie de jour de la date actuelle

CONVERT(CHAR(8),GetDate(),112)) est d'obtenir la date actuelle dans YYYMMDD

(dateadd(dd,-(datepart(dd,getdate())),CONVERT(CHAR(8),GetDate(),112))) est en soustrayant la partie de jour de la date d'aujourd'hui (voir signe négatif).

Ainsi, il essaie d'obtenir le premier jour du mois en cours. Dans le cas où le résultat de l'expression ci-dessus croise le dernier jour du mois précédent, il ajoute 23 heures et 59 minutes.

La logique était probablement destinée à obtenir le dernier jour du mois précédent. Cet ajout de ~ 24 heures crée de la confusion.

0

Cela vous aidera à:

declare @First datetime = dateadd(month,datediff(month,0,getdate()),0) 
declare @Last datetime = dateadd(second,-1,dateadd(month,datediff(month,0,getdate())+1,0)) 

chèques @first pour le nombre de mois de zéro à ce jour, ajoute que nombre de mois à zéro pour vous donner le premier moment de ce mois-ci. @Dernière fonctionne de manière similaire, mais ajoute un mois au nombre de mois ajoutés à ZERO pour vous donner le premier moment du mois suivant, puis il soustrait 1 seconde de cette date pour vous donner la dernière seconde du dernier jour de ce mois-ci.

Si vous devez passer à MS, vous pouvez changer le dernier bit à soustraire 3 millisecondes au lieu de 1 seconde.