SET DATEFIRST en FONCTION
Je veux mettre DATEFIRST dans ma fonction, mais il n'est pas permis.
SET DATEFIRST 1
Je peux ajouter le code dans une SP et appelez le SP de la fonction, mais je ne suis pas désireux de le faire.
Je peux mettre le DATEFIRST avant que j'appelle ma fonction, mais je ne suis pas désireux de le faire ainsi.
Tout autre travail?
MODIFIER
Ci-dessous le code que je veux utiliser ma FONCTION pour renvoyer le nombre total de jours ouvrés du mois. Mais je ne peux pas ajouter ce code dans la FONCTION, car de mon DATEFIRST
DECLARE @my int
DECLARE @myDeduct int
DECLARE @day INT
DECLARE @mydate DATETIME
DECLARE @TotalDays INT
SET @mydate = GETDATE()
SET @myDeduct = 0
IF (@@DATEFIRST + DATEPART(DW, @mydate)) % 7 not in (0,1)
SET DateFirst 1 -- Set it monday=1 (value)
--Saturday and Sunday on the first and last day of a month will Deduct 1
IF (DATEPART(weekday,(DATEADD(dd,-(DAY(@mydate)-1),@mydate))) > 5)
SET @myDeduct = @myDeduct + 1
IF (DATEPART(weekday,(DATEADD(dd,-(DAY(DATEADD(mm,1,@mydate))),DATEADD(mm,1,@mydate)))) > 5)
SET @myDeduct = @myDeduct + 1
SET @my = day(DATEADD(dd,-(DAY(DATEADD(mm,1,@mydate))),DATEADD(mm,1,@mydate)))
Set @TotalDays = (select (((@my/7) * 5 + (@my%7)) - @myDeduct))
Select @TotalDays
Vous pourriez peut-être retravailler la logique de votre fonction, de manière à ne dépendent pas de
Quel est votre vrai problème, pas la solution que vous proposez?
Veuillez voir ci-dessus, j'ai ajouté mon code pour expliquer comment je veux l'utiliser.
set datefirst
?Quel est votre vrai problème, pas la solution que vous proposez?
Veuillez voir ci-dessus, j'ai ajouté mon code pour expliquer comment je veux l'utiliser.
OriginalL'auteur Etienne | 2012-09-19
Vous devez vous connecter pour publier un commentaire.
Mon habitude solution de contournement consiste à utiliser des "bonnes" les dates de mes comparaisons.
Dire, par exemple, que j'ai besoin de vérifier qu'une date est un samedi. Plutôt que de compter sur
DATEFIRST
ou les paramètres de langue (pour l'utilisation desDATENAME
), j'ai plutôt dire:Je sais que le 14 juillet 2012 était un samedi, j'ai donc effectué la vérification sans se fondant sur les paramètres externe.
L'expression
(DATEPART(weekday,DateToCheck) + @@DATEFIRST) % 7
produira toujours la valeur 0 pour le samedi 1 dimanche 2 lundi, etc.Donc, je vous conseille de créer un tableau:
Le remplissage de ce tableau est un exercice.
NormalisedDay
serait la valeur calculée par l'expression que j'ai donné ci-dessus.Pour calculer la
DaysInMonth
donné à une date donnée, vous pouvez utiliser l'expression:Maintenant tout votre fonction a à faire est de rechercher la valeur dans le tableau.
(Bien sûr, toutes les lignes où
DaysInMonth
est 28 20 comme leur résultat. C'est uniquement les lignes pour les 29,30 et 31, qui ont besoin d'un peu de travail à produire)J'ai ajouté quelques expressions utiles et une proposition de solution.
+1 pour
(DATEPART(weekday,DateToCheck) + @@DATEFIRST) % 7
, une valeur inestimable! que bat en comparant les noms de la semaine, de toute façon :OOriginalL'auteur Damien_The_Unbeliever
Au lieu de
Vous pouvez faire
mais la réponse que vous avez lié, à la différence de celui-ci, ne tient pas compte de la valeur actuelle de
@@datefirst
, de sorte qu'il ne fonctionne que si c'était que le dimanche est le jour de la semaine1
. Vous pourriez peut-être poster une autre réponse que des correctifs. 😛De toute façon, +1, bien que j'ai utilisé une version modifiée sans la soustraction et l'addition, puisque je n'ai besoin que les chiffres soient cohérents, non spécifique. Donc
0
est samedi,1
est dimanche, etc. Cela signifie que I (A) peut accueillirdatefirst
dans une fonction et (B) sans le spécifique à la région, le ralentissement de la bidouille de comparer spécifiquesdatename
s à la place.OriginalL'auteur Kvasi
Si vous avez besoin d'lundi firstday suivre cet extrait de code
@@datefirst
. Il a juste fait tourner' les jours de la semaine sur cette base, de sorte que vous obtenez seulement1
pour lundi si le courant@@datefirst
est dimanche. Qui peut suffire pour certains lecteurs, mais ce n'est pas une réponse exhaustive comme Kvasi. Qu'une autre note, n'est-ce pas le<= 7
redondant, car il ne peut y avoir> 7
les jours de la semaine en une semaine?Oui le
<= 7
pourrait aussi être une simpleELSE
. Au moins jusqu'à ce que nous obtenons de 8 jours à une semaine 😉OriginalL'auteur James K
Alternative consiste à spécifier explicitement le premier jour de la semaine de la valeur de paramètre et ne pas dépendre de
@@DATEFIRST
réglage. Vous pouvez utiliser la formule suivante pour que votre fonction:où
@WeekStartDay
est le premier jour de la semaine que vous voulez pour votre système (de 1 à 7, ce qui signifie, du lundi au dimanche).J'ai enveloppé en-dessous de la fonction, de sorte que nous pouvons les réutiliser facilement:
Exemple d'utilisation:
GetDayInWeek('2019-02-04 00:00:00', 1)
Il est équivalente à la suivante (mais indépendant de DATEFIRST réglage):
OriginalL'auteur Minh Nguyen