Comment créer de l'heure d'été l'heure de Début et de Fin de fonction en SQL Server
J'ai besoin de créer une fonction en SQL serveur renvoie l'heure d'été début datetime et de l'heure d'été fin datetime.
Je suis venu à travers quelques exemples sur le web, mais ils sont tous à l'aide de la 1ère date de Mars et le 1er jour du mois de novembre et ce n'est pas techniquement correcte.
L'heure d'été commence à 2H du matin sur le 2ème dimanche de Mars et se termine à 2H du matin le premier dimanche de novembre.
J'ai commencé avec le code ci-dessous mais je suis sûr que c'est faux. Toute aide est très appréciée! 🙂
DECLARE @DSTSTART DATETIME
SELECT @DSTSTART = CASE WHEN
DATEPART(MONTH, SYSDATETIME()) = 3
AND DATEPART(weekday, SYSDATETIME()) = 1
AND DATEDIFF(week,dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, SYSDATETIME()), 0)), 0), SYSDATETIME() - 1) = 2
AND DATEPART(HOUR, SYSDATETIME()) = 2
THEN SYSDATETIME()
END
RETURN (@DSTSTART)
END
GO
Je recommande que, lorsque vous vous réveillez le dimanche, vous exécutez une sélection getdate() de la requête. Si elle retourne le temps correct pour l'endroit où vous vivez, il pourrait ne pas être nécessaire de faire quoi que ce soit.
Merci à vous, je me dois de préciser...la date qui est stockée dans notre base de données est l'heure UTC et est capturé au moment de chaque transaction. Nous ne recueillons les données de l'US, mais dans des fuseaux horaires différents. J'ai besoin de convertir les dates à est le temps à des fins de reporting. Donc, quand je lance la requête que j'ai été manuellement le calcul de l'est du temps. Cependant, depuis l'heure d'été se termine ce dimanche et j'ai une tonne de rapports à modifier, j'ai été en espérant pour créer une fonction, donc je n'aurai pas à le faire de nouveau, en Mars 🙂
Merci à vous, je me dois de préciser...la date qui est stockée dans notre base de données est l'heure UTC et est capturé au moment de chaque transaction. Nous ne recueillons les données de l'US, mais dans des fuseaux horaires différents. J'ai besoin de convertir les dates à est le temps à des fins de reporting. Donc, quand je lance la requête que j'ai été manuellement le calcul de l'est du temps. Cependant, depuis l'heure d'été se termine ce dimanche et j'ai une tonne de rapports à modifier, j'ai été en espérant pour créer une fonction, donc je n'aurai pas à le faire de nouveau, en Mars 🙂
OriginalL'auteur Amanda Brine | 2013-11-01
Vous devez vous connecter pour publier un commentaire.
N'oubliez pas que l'heure d'été les horaires changent selon les pays, et sont également soumis à des changements au fil des ans: l'actuel système des états-unis a pris effet en 2007, par exemple.
En supposant que vous voulez que le système actuel pour les etats-unis, voici un formulaire de réponse pour une année donnée.
ou comme des fonctions, mais vous devez savoir que DateFirst est fixé à 7, autrement les mathématiques.
DATEFIRST
est un paramètre SQL server qui détermine ce que le serveur considère la première journée de la semaine. NOUS, et par défaut de SQL Server, est de 7, ou le dimanche, mais de 1 (lundi) est parfois utilisé. Vous ne pouvez pas les modifier dans une fonction, mais vous pouvez pour une procédure stockée.@@DATEFIRST
récupérer la valeur. technet.microsoft.com/en-us/library/ms181598.aspxGénial, ça fonctionne parfaitement! J'ai passé du temps à essayer de comprendre les mathématiques derrière elle et j'en suis venu à la conclusion que vous n'avez pas besoin de soustraire le jour de la semaine (dw) à partir de 15, vous pouvez utiliser 8, parce que vous êtes alors %7, à droite? Ne pas faire semblant de vous déjouer ou quoi que ce soit, juste pour s'assurer que j'ai bien compris! TY
Oui, vous êtes au bon endroit. Je ne me souviens pas le raisonnement pour le 15 au lieu de 8, mais le résultat est le même.
OriginalL'auteur Jamie F
Personnellement, je pense que c'est plus facile de trouver le premier dimanche de novembre qu'elle ne l'est pour trouver le deuxième dimanche de Mars. Heureusement, si vous en trouvez un, vous pouvez trouver les autres car il y a toujours 238 jours entre eux. Alors, voici une fonction très pratique pour trouver la fin de l'heure d'été:
Le Début de l'heure d'été est la même fonction, seulement 238 jours plus tôt.
Je pense que vous ne comprenez pas, @GoldBishop - Il y a toujours 238 jours entre le 2e dimanche de Mars et le 1er dimanche de novembre pour une année donnée. Année bissextile est avant le mois de Mars, de sorte qu'il n'a pas d'importance si il y a 28 ou 29 jours. Je trouve que c'est plus facile d'obtenir le 1er dimanche de novembre, puis de soustraire 238 jours qu'elle ne l'est pour trouver le 2ème dimanche de Mars et d'ajouter 238 jours.
Exactement...votre déclaration
I think it's easier to find the first Sunday in November than it is to find the second Sunday in March
...qui je l'ai interprété comme étant de commencer à novembre et de goto Mars...mais alors, vous vous auto-corriger avec...because there's always 238 days between them...
, qui est aussi déroutant que vous n'avez pas de déterminer la date de début et de fin. Bien queassumption
serait que de Mars à novembre serait le plus grand de la fenêtre....Je trouve qu'il vaut mieux ne pasassume
avec la communauté 😉OriginalL'auteur Brian Stork
SQL Server version 2016 permettra de résoudre cette question une fois pour toutes. Pour les versions antérieures d'un CLR solution est probablement la plus facile. Soit pour une heure d'été de la règle (comme NOUS), T-SQL fonction peut être relativement simple.
Cependant, je pense qu'un T-SQL générique solution serait peut-être possible. Aussi longtemps que
xp_regread
fonctionne, essayez ceci:Un (complexe) de T-SQL fonction pourrait utiliser ces données pour déterminer le décalage exact pour toutes les dates au cours de l'heure d'été la règle.
Que la première phrase! Je ne peux pas upvote cette réponse assez! Je souhaite que j'avais connu sur
at time zone
il y a longtemps!OriginalL'auteur Michel de Ruiter
Je n'étais pas vraiment satisfait de toutes les solutions que j'ai trouvé en ligne pour convertir UTC en heure locale, alors je suis venu avec cette fonction. Jetez un oeil à mes DONC la réponse ici
Il y a une certaine logique là-dedans, qui calcule si l'heure d'été est active basée sur la norme de la plage de dates de l'heure d'été utilise (Deuxième dimanche de Mars à 2 heures du matin, horloges aller de l'avant; le 1er dimanche de novembre revenir à l'heure normale)
OriginalL'auteur Adam Hey