2010-04-15 3 views
0

Donc, j'ai un problème idiot, je n'ai pas utilisé beaucoup SQL Server avant, ou tout SQL d'ailleurs. J'ai fondamentalement un problème mathématique mineur dont j'ai besoin résolu, et je pensais que modulo serait bon. J'ai un certain nombre de dates dans la base de données, mais j'ai besoin qu'ils soient arrondis à l'entier dynamique le plus proche (peut être n'importe quoi de 0 à 5000000) qui sera entré comme paramètre chaque fois que cette requête est appelée .Microsoft SQL Server 2005 - en utilisant l'opérateur modulo

J'ai donc pensé utiliser modulo pour trouver le reste, puis soustraire ce reste de la date. S'il y a un meilleur moyen, ou une fonction intégrée, s'il vous plaît faites le moi savoir!

Quelle serait la syntaxe pour cela? J'ai essayé beaucoup de choses, mais je continue d'obtenir des messages d'erreur comme les nombres entiers/flottants/décimaux ne peuvent pas être utilisés avec les opérateurs modulo. J'ai essayé de lancer toutes sortes de types de données numériques.

Toute aide serait appréciée.

+0

Puis-je vous demander à quoi cela sert-il? Cela semble plutôt rond. –

+0

Permet de sortir un nombre défini de dates dans un intervalle. Jamais plus, jamais moins. – cc0

+0

Ainsi, un cas d'utilisation pourrait être "obtenez-moi 40 dates entre 01/01/2010 et 31/12/2010, espacées régulièrement." Est-ce que je vous lis correctement? Pourriez-vous me donner un exemple de la façon dont cela serait utilisé? –

Répondre

1
Create function [GetNDates] 
(
@NumberOfDates int, 
@StartDate DateTime, 
@EndDate DateTime 
) 
Returns @DatesTable table 
(
    MyDate DateTime 
) 
As 
Begin 
Declare @TotalDays int 
Declare @Increment int 
Declare @Counter int 
Declare @DateCounter DateTime 
SET @Counter = 0 
SELECT @DateCounter = @StartDate 
SELECT @TotalDays = DATEDIFF(day, @StartDate, @EndDate) 
SET @Increment = @TotalDays/@NumberOfDates 
WHILE @Counter < @NumberOfDates 
BEGIN 
    SET @DateCounter = DATEADD(Day, @Increment, @DateCounter) 
    INSERT INTO @DatesTable (MyDate) VALUES (@DateCounter) 
    SET @Counter = @Counter + 1 
END 
Return 
End 
GO 

select * from dbo.GetNDates(40, '1/1/2010', '12/31/2010') 
+0

Merci, c'était très utile:] – cc0