2008-10-27 5 views
3

I ont besoin d'une formule de date dans Oracle SQL ou T-SQL qui retourne une date de la semaine précédente (par exemple, date du dernier lundi).Date de SQL Formules

J'ai des rapports avec des paramètres qui sont exécutés chaque semaine habituellement avec des dates de paramètres mon-vendredi ou dimanche-samedi de la semaine précédente. Je voudrais ne pas avoir à saisir les dates quand je lance les rapports chaque semaine.

Les données sont dans Oracle et j'utilise SQL Server 2005 Reporting Services (SSRS) pour les rapports.

Répondre

2

T-SQL:

SELECT 
    DateColumn, 
    DateColumn - CASE DATEPART(dw, DateColumn) 
       WHEN 1 THEN 6 
       ELSE DATEPART(dw, DateColumn) - 2 
       END MondayOfDateColumn 
FROM 
    TheTable 

Avez-vous besoin de la part de temps pour être "00:00:00" aussi?

Si, ajoutez cette expression au calcul:

DATEADD(dd, 0, DATEDIFF(dd, 0, DateColumn)) - CASE DATEPART(dw, /* etc. etc. */ 
+0

Dans SQL Server, le dimanche est 1. – DOK

+0

La formule en tient compte. – Tomalak

+0

Que renvoient vos calculs pour une date de dimanche, par exemple '10/26/2008 '? – DOK

1

Vérifiez la liste des fonctions de date dans this post. Tu veux celui-ci.

SELECT (DATEADD(wk,DATEDIFF(wk,0,GETDATE()) -1 ,0)) 

Ils sont presque toujours les mathématiques et non chaîne orientées de sorte qu'ils fonctionneront plus vite que boîtier ou opérations casted

+0

Cela semble être éteint par une semaine. – Tomalak

+0

C'est le lundi précédent. Si aujourd'hui c'est mardi alors ça va se passer hier – StingyJack

-1

Une solution T-SQL:

Si l'on suppose que SET DATEFIRST est la valeur par défaut (dimanche = 7), la dernière date du lundi:

SELECT 
DATEADD(dy, DATEPART(dw, GETDATE()) - 9, GETDATE()) 

le « -9' est de revenir une semaine (-7) et est depuis lundi 2 nous soustrayons 2 de plus en ajoutant le jour de la w Eek pour la journée en cours.

+0

J'ai essayé ça contre 2008-10-28. Avec DateFirst = 1 il m'a donné 2008-10-21. Avec DateFirst = 7, il m'a donné 2008-10-22. Ni l'un ni l'autre sont des lundis. –

+0

SELECT @@ DATEFIRST SELECT DATEADD (dy, DATEPART (dw, GETDATE()) - 9, GETDATE()) Résultats: ---- 7 (1 ligne (s) affecté) ----------------------- 2008-10-20 15: 31: 35.583 (1 ligne (s) concernée (s)) –

1

Voici ma solution, testée contre 8 jours.

SET DateFirst 7 

DECLARE @Today datetime 

SET @Today = '2008-10-22' 
SELECT DateAdd(wk, DateDiff(wk, 0, DateAdd(dd, -1, @Today)) - 1, 0) as PreviousMonday, @Today as Today 
SET @Today = '2008-10-23' 
SELECT DateAdd(wk, DateDiff(wk, 0, DateAdd(dd, -1, @Today)) - 1, 0) as PreviousMonday, @Today as Today 
SET @Today = '2008-10-24' 
SELECT DateAdd(wk, DateDiff(wk, 0, DateAdd(dd, -1, @Today)) - 1, 0) as PreviousMonday, @Today as Today 
SET @Today = '2008-10-25' 
SELECT DateAdd(wk, DateDiff(wk, 0, DateAdd(dd, -1, @Today)) - 1, 0) as PreviousMonday, @Today as Today 

SET @Today = '2008-10-26' 
SELECT DateAdd(wk, DateDiff(wk, 0, DateAdd(dd, -1, @Today)) - 1, 0) as PreviousMonday, @Today as Today 
SET @Today = '2008-10-27' 
SELECT DateAdd(wk, DateDiff(wk, 0, DateAdd(dd, -1, @Today)) - 1, 0) as PreviousMonday, @Today as Today 
SET @Today = '2008-10-28' 
SELECT DateAdd(wk, DateDiff(wk, 0, DateAdd(dd, -1, @Today)) - 1, 0) as PreviousMonday, @Today as Today 
SET @Today = '2008-10-29' 
SELECT DateAdd(wk, DateDiff(wk, 0, DateAdd(dd, -1, @Today)) - 1, 0) as PreviousMonday, @Today as Today 

est ici le problème avec dimanche:

SELECT 
    DateDiff(wk, 0, '2008-10-25') as SatWeek, --5677 
    DateDiff(wk, 0, '2008-10-26') as SunWeek, --5688 
    DateDiff(wk, 0, '2008-10-27') as MonWeek --5688 

SELECT 
    DatePart(dw, '2008-10-25') as SatPart, --7 
    DatePart(dw, '2008-10-26') as SunPart, --1 
    DatePart(dw, '2008-10-27') as MonPart, --2 
    convert(datetime,'2008-10-25') - (DatePart(dw, '2008-10-25') - 2) as SatMonday, 
    --'2008-10-20' 
    convert(datetime,'2008-10-26') - (-1) as SunMonday, 
    --'2008-10-27' 
    convert(datetime,'2008-10-27') - (DatePart(dw, '2008-10-27') - 2) as MonMonday 
    --'2008-10-27' 

Un grand nombre de ces solutions offrent la même réponse pour dimanche et lundi dans la même semaine. Le vieux lundi ne devrait pas être démissionné jusqu'à ce qu'un autre lundi se soit produit.

0

Dans Oracle:

Edit: Fait un peu plus concis

Edit: Leigh Riffel a posté une solution beaucoup mieux que la mienne.

select 
    case when 2 = to_char(sysdate-1,'D') then sysdate - 1 
     when 2 = to_char(sysdate-2,'D') then sysdate - 2 
     when 2 = to_char(sysdate-3,'D') then sysdate - 3 
     when 2 = to_char(sysdate-4,'D') then sysdate - 4 
     when 2 = to_char(sysdate-5,'D') then sysdate - 5 
     when 2 = to_char(sysdate-6,'D') then sysdate - 6 
     when 2 = to_char(sysdate-7,'D') then sysdate - 7 
    end as last_monday 
from dual 
+0

Merci pour le genre commentaire. –

2

Voici une solution Oracle pour lundi.

select sysdate - 5 - to_number(to_char(sysdate,'D')) from dual 

Voici des exemples qui récupèrent un jour particulier de la semaine précédente.

SELECT sysdate - 6 - to_number(to_char(sysdate,'D')) LastSunday FROM dual; 
SELECT sysdate - 5 - to_number(to_char(sysdate,'D')) LastMonday FROM dual; 
SELECT sysdate - 4 - to_number(to_char(sysdate,'D')) LastTuesday FROM dual; 
SELECT sysdate - 3 - to_number(to_char(sysdate,'D')) LastWednesday FROM dual; 
SELECT sysdate - 2 - to_number(to_char(sysdate,'D')) LastThursday FROM dual; 
SELECT sysdate - 1 - to_number(to_char(sysdate,'D')) LastFriday FROM dual; 
SELECT sysdate - 0 - to_number(to_char(sysdate,'D')) LastSaturday FROM dual; 

Si vous souhaitez que la partie de l'heure soit 00:00:00, enroulez la position dans TRUNC (...).

+0

Quelqu'un at-il l'équivalent SQL Server? – DOK

1

(Oracle)

trunc (sysdate, 'IW') --gives cette semaine lundi

trunc ('IW' sysdate,) - 7 --gives semaine dernière lundi

Cette Suppose que vous considérez que le lundi soit le premier jour de la semaine, ce que signifie «IW» (Semaine ISO). Si vous considérez dimanche comme le premier jour de la semaine ...

trunc (sysdate, « W ») + 1 --gives lundi de cette semaine, le dimanche, ce sera à l'avenir

trunc (sysdate, 'W') + 1-7 - donne le lundi de la semaine dernière

+0

Qu'est-ce que vous obtenez le dimanche? – DOK

+0

Sur mon système, le dimanche 26 donne le lundi précédent comme le 13 plutôt que le 20 comme suit: SELECT trunc (to_date ('10/26/2008 ',' MM/JJ/AAAA '),' IW ') - 7 depuis double; –

+0

trunc (sysdate + 1, 'IW') - 7 semble résoudre le problème du dimanche. –