Maison >base de données >tutoriel mysql >Comment récupérer efficacement les données du mois dernier dans SQL Server ?

Comment récupérer efficacement les données du mois dernier dans SQL Server ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-05 06:31:40206parcourir

How to Efficiently Retrieve Last Month's Data in SQL Server?

Comment récupérer les enregistrements du mois dernier dans SQL Server

Pour obtenir des enregistrements d'une période spécifique, une pratique courante consiste à utiliser des requêtes par plage avec des limites inférieures et supérieures inclusives. Cependant, cette approche pose deux défis : compromettre l'utilisation de l'index et potentiellement sélectionner des données involontaires.

1. Utilisation de l'index :

L'application de fonctions à une colonne recherchée, y compris des fonctions implicites telles que la conversion, peut forcer l'optimiseur à ignorer les index sur cette colonne, ce qui entraîne une recherche linéaire dans chaque enregistrement. Considérez les horodatages, qui sont généralement stockés sous forme de décompte chronologique. L'extraction de parties de date à partir de tels horodatages nécessite des calculs complexes, ce qui ralentit la requête.

2. Données involontaires :

Les plages de limite supérieure inclusives, telles que <=, peuvent entraîner une sélection de données incorrecte, en fonction de la version de SQL Server et des types de données des colonnes. Les données de minuit du lendemain ou les enregistrements de parties de la journée en cours peuvent être inclus ou exclus par erreur.

Approche correcte :

Pour résoudre ces problèmes, utilisez l'option structure de requête suivante :

WHERE date_created >= @startOfPreviousMonth AND date_created < @startOfCurrentMonth

Pour déterminer le début des mois précédent et en cours, utilisez ce qui suit calculs :

@startOfPreviousMonth = DATEADD(month, -1, @startOfCurrentMonth)
@startOfCurrentMonth = DATEADD(month, DATEDIFF(month, 0, CURRENT_TIMESTAMP), 0)

Cette approche garantit l'utilisation de l'index et une sélection précise des données. Le script complet serait :

DECLARE @startOfCurrentMonth DATETIME
SET @startOfCurrentMonth = DATEADD(month, DATEDIFF(month, 0, CURRENT_TIMESTAMP), 0)

SELECT *
FROM Member
WHERE date_created >= DATEADD(month, -1, @startOfCurrentMonth)
AND date_created < @startOfCurrentMonth

En effectuant des opérations de date une seule fois sur une seule valeur, l'optimiseur peut exploiter les indices et la requête renvoie des données correctes.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn