Pièges DATEADD liés aux grands nombres entiers
Lorsque vous travaillez avec des horodatages de grands entiers, la fonction DATEADD dans SQL Server peut rencontrer des limitations. Cet article explore un cas spécifique dans lequel une grande valeur entière provoque une erreur de dépassement arithmétique.
Problème
Considérez l'instruction SQL suivante, destinée à convertir un horodatage JavaScript volumineux en une date SQL :
DATEADD(MILLISECOND, cast(569337307200000 as bigint) % 1000, DATEADD(SECOND, cast(569337307200000 as bigint) / 1000, '19700101'))
Sur SQL Server 2008, l'exécution de cette instruction entraîne une "Erreur de débordement arithmétique lors de la conversion de l'expression en type de données int."
Solution
La clé pour surmonter cette erreur réside dans la décomposition de l'opération DATEADD en morceaux plus petits. En ajoutant initialement le temps en unités plus grandes (par exemple, secondes ou minutes), puis en ajoutant les millisecondes restantes, nous pouvons éviter le débordement.
Par exemple, l'instruction suivante calcule l'heure de début pour une durée importante (en millisecondes) :
DATEADD(ms, -large_duration_ms%60000, DATEADD(minute, -large_duration_ms/60000, GETDATE()))
Cet exemple soustrait d'abord les minutes de la grande durée, puis ajoute les millisecondes restantes. Cette approche garantit que les calculs intermédiaires ne débordent pas.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!