Comment obtenir de l'entreprise Précédente journée, dans une semaine avec celle de la Journée de travail en cours à l'aide de sql server
j'ai un Package ssis qui s'exécute sur les jours ouvrables (lundi-Vendredi). si je reçois un fichier, mardi , à l'arrière-plan(DB), il prend le jour ouvrable précédent la date et effectue certaines transactions. Si j'exécute le travail vendredi, c'est pour aller chercher les lundis de la date et de traiter les transactions.
j'ai utilisé la requête ci-dessous pour obtenir ouvrable précédent la date
Select Convert(varchar(50), Position_ID) as Position_ID,
TransAmount_Base,
Insert_Date as InsertDate
from tblsample
Where AsOfdate = Dateadd(dd, -1, Convert(datetime, Convert(varchar(10), '03/28/2012', 101), 120))
Order By Position_ID
si j'exécute cette requête, je vais avoir les résultats de hiers Transactios. si j'exécute la même requête, le lundi, il doit extraire les vendredis les transactions au lieu de dimanche.
OriginalL'auteur 0537 | 2012-03-29
Vous devez vous connecter pour publier un commentaire.
Je préfère utiliser
DATENAME
pour ce genre de choses surDATEPART
qu'il supprime la nécessité de mettre enDATEFIRST
Et s'assure que les variations de l'heure/de la date sur des machines locales n'affecte pas les résultats. EnfinDATEDIFF(DAY, 0, GETDATE())
va supprimer la partie deGETDATE()
, éliminant le besoin de les convertir à varchar (beaucoup plus lent).MODIFIER (presque 2 ans)
Cette réponse a été très tôt dans mon SORTE de carrière et ça m'énerve à chaque fois qu'il obtient upvoted parce que je n'ai plus d'accord avec le sentiment de l'aide DATENAME.
Beaucoup plus rubust solution serait:
Cela fonctionne pour toutes les langues et les DATEFIRST paramètres.
DATENAME
pour éviter d'avoir à savoirDATEFIRST
, encore terminer en ignorant que c'est un langage spécifique?Très bon point. Cependant, j'ai rencontré plus d'scénarios où DATEFIRST conflits qui ont été un problème que les scénarios où les conflits linguistiques ont été un problème. Par exemple, si vous créez un fichier UDF dans votre base de données n'a pas pu définir la date de la première au sein de l'UDF, vous serait tributaire de la requête d'appel de la fonction pour définir le bon datefirst (ou non la définition d'un autre datefirst), il est plus probable qu'un utilisateur sera nécessaire de définir une autre datefirst que d'une langue à l'autre (dans mon expérience).
Pour préciser davantage, j'ai l'habitude de travailler dans une entreprise où la commission de la semaine s'étend de mercredi à mardi pour le Papier de vente, et du vendredi au Jeudis pour la Télévente, On pourrait utiliser les mêmes requêtes de rapport sur ce par la mise en datefirst en conséquence, cela aurait rendu toute utilisation de DATEPART(JOUR, le [date]) afin d'identifier les week-ends inutile. C'est pourquoi j'ai préférez pour utiliser datename. Je ne plaide pas pour qu'elle soit impeccable.
SALUT, j'ai trié le problème en sélectionnant date Maximale de la AsofDate colonne. Donc à chaque fois il n'a pas besoin de vérifier si la journée ouvrable précédente est vendredi ou un autre jour. Sélectionnez Convert(varchar(50),Position_ID) Position_ID,TransAmount_Base, Insert_Date comme InsertDate de BLE..tblIncome_Staging Où AsOfdate = (select max(AsofDate) à partir de tblsample ) Commande Par Position_IDthis était la logique, que je mis en œuvre.
Pourquoi avez-vous besoin d'écrire DATEDIFF(JOUR, 0, GETDATE()) à la fin, au lieu de GETDATE()?
OriginalL'auteur GarethD
Alors:
OriginalL'auteur noworries
La solution la plus simple pour trouver le jour ouvrable précédent est d'utiliser un calendrier de table avec une colonne appelée
IsBusinessDay
ou quelque chose de similaire. Votre requête est quelque chose comme ceci:Le problème avec utilisation de fonctions, c'est que quand (pas si), vous devrez créer des exceptions pour une raison quelconque (fêtes nationales, etc.) le code devient vite difficile à maintenir; avec la table, vous avez juste
UPDATE
une valeur unique. Une table rend également beaucoup plus facile de répondre à des questions comme "combien de jours sont là, entre les dates de X et de Y", qui sont assez communs dans les tâches de reporting.OriginalL'auteur Pondlife
Vous pouvez facilement faire cela un appel de fonction, l'ajout d'un deuxième paramètre à remplacer GetDate() avec quelle que soit la date à laquelle vous avez voulu.
Il va travailler pour n'importe quel jour de la semaine, à toute date de plage, si vous modifiez la fonction GetDate().
Elle ne va pas changer la date si le jour de la semaine est la date d'entrée (GetDate())
OriginalL'auteur SimpleMan
DATEPART(dw...
sans connaître laDATEFIRST
paramètre est ambigu. Ne pas le faire.OriginalL'auteur paul
merci pour les conseils ci-dessus, j'ai eu une légère variante de la requête dans le que mon utilisateur est nécessaire toutes les valeurs pour le jour ouvrable précédent. Par exemple, aujourd'hui est un lundi, donc il a besoin de tout ce qui est entre, vendredi dernier, à minuit au samedi à Minuit. Je l'ai fait à l'aide d'une combinaison de ce qui précède, et "entre", juste si quelqu'un est intéressé. Je ne suis pas une énorme pointe de la technique.
OriginalL'auteur stamina_josh
Plus élégant:
OriginalL'auteur Jason Lloyd