2011-01-15 1 views
0

J'ai besoin de conseils pour obtenir de la valeur de la base de données dans un délai d'une semaine. J'ai compris comment utiliser DATEPART où je peux faire DATEPART(wk, date_value) = DATEPART(datepart, GETDATE()) mais ce que je ne peux pas comprendre est comment faire un jour spécifique de la semaine. Comme je veux seulement récupérer des informations de ce mardi à mardi prochain. Quelqu'un peut-il offrir à quelqu'un d'offrir des conseils?SQL Server obtenant de la valeur dans une période de temps de la semaine

Merci!

+0

Comment définissez-vous "ce mardi"? Cela signifie-t-il le mardi le plus proche dans le futur par rapport à maintenant? Le mardi qui est dans la même semaine que le jour actuel? Autre chose? –

+0

mardi dans la semaine en cours aussi mardi prochain. –

Répondre

1

Dans SQL Server, vous pouvez faire quelque chose comme ceci:

Set DateFirst 1; 

Select DateAdd(d, -DatePart(dw, CURRENT_TIMESTAMP) + 3 
     , CURRENT_TIMESTAMP) As ThisWeekTuesday 
    , DateAdd(d, 7, DateAdd(d, -DatePart(dw, CURRENT_TIMESTAMP) + 3 
     , CURRENT_TIMESTAMP)) As TuesdayAfterThat 

Dans Microsoft Access, vous feriez quelque chose comme:

Select DateAdd("d", -DatePart("w", Now()) + 3, Now()) As ThisWeekTuesday 
    , DateAdd("d", 7, DateAdd("d", -DatePart("w", Now()) + 3 
     , Now())) As TuesdayAfterThat 
0

Je recommande la création d'une table de dates - sauvegarder un enregistrement par jour, avec des champs pour SQLDate, DateAsText, année, mois, MonthAsText, DayOfWeek, DayOfWeekAsText, etc. Ensuite, vous pouvez interroger comme ceci:

SELECT 
    MIN(SQLDate) 
FROM 
    Dates 
WHERE 
     SQLDate > SYSDATETIME() 
    AND DayOfWeekText = 'Tuesday' 

Si vous préférez ne pas le faire maintenant, vous pouvez également utiliser DATEPART() et DATEADD(). Pour le mardi prochain à venir, je crois que ce serait:

DECLARE @TodaysDayOfWeek = DATEPART(DW, SYSDATETIME()) 
SELECT 
    CASE WHEN @TodaysDayOfWeek < 3 DATEADD(3 - @TodaysDayOfWeek, SYSDATETIME()) 
     ELSE      DATEADD(10 - @TodaysDayOfWeek, SYSDATETIME() END 

Je n'ai pas MS SQL à portée de main pour confirmer, mais il devrait fonctionner si DW commence à 1 pour dimanche et se termine par 7 pour le samedi (ce peut varier en fonction de votre config). Notez que, s'il est appelé un mardi, il donnera suivant mardi, pas aujourd'hui; Pour inverser ce comportement, remplacez "< 3" par "< = 3".

+0

Désolé, mais la création de tables de dates doit être le dernier recours lorsqu'aucune autre option ne fonctionne. Dans le scénario que vous présentez, cela peut être résolu de différentes façons sans ajouter de tâche de maintenance/administrative comme celle-ci. –

Questions connexes