2008-10-27 2 views
3

Мне нужна формула даты в Oracle SQL или T-SQL, которая вернет дату предыдущей недели (например, дата последнего понедельника).Формулы даты SQL

У меня есть отчеты с параметрами, которые запускаются каждую неделю, как правило, с датами параметров с понедельника по пятницу или с воскресенья по субботам на прошлой неделе. Я бы не хотел вводить даты, когда я запускаю отчеты каждую неделю.

Данные находятся в Oracle, и я использую службы отчетов SQL Server 2005 (SSRS) для отчетов.

ответ

2

T-SQL:

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

ли вам нужно время, чтобы быть частью "00:00:00", тоже?

Если да, то добавить это выражение для вычисления:

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

В SQL Server воскресенье равно 1. – DOK 2008-10-27 15:53:55

+0

Формула учитывает это. – Tomalak 2008-10-27 16:55:05

+0

Каковы ваши расчеты для воскресной даты, например «10/26/2008»? – DOK 2008-10-27 19:04:14

1

Заканчивать список дат функций в this post. Ты хочешь этого.

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

Они почти всегда математика, а не строка ориентированы так, что они будут работать быстрее, чем корпус или отлитые операции

+0

Кажется, что она отключена на одну неделю. – Tomalak 2008-10-27 16:02:29

+0

Его предыдущий понедельник. Если сегодня вторник, то он собирается получить вчера – StingyJack 2008-10-28 13:49:01

-1

Решение T-SQL:

Предполагая, что SET DATEFIRST находится по умолчанию (воскресенье = 7), дата последнего понедельника:

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

«-9' , чтобы вернуться одна неделя (-7), а затем с понедельника 2 мы вычитаем 2 больше и добавление день ш на текущий день.

+0

Я пробовал это против 2008-10-28. С DateFirst = 1 это дало мне 2008-10-21. С DateFirst = 7 это дало мне 2008-10-22. Ни один из них не по понедельникам. – 2008-10-27 16:12:54

1

Вот мое решение, проверено на 8 дней.

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 

Вот беда воскресенье:

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' 

Многие из этих решений обеспечить тот же ответ на воскресенье и в понедельник в одной и той же недели. Старый понедельник не должен быть подан в отставку до следующего понедельника.

0

В Oracle:

Edit: Сделано это немного более кратким

Edit: Leigh Riffel отправил гораздо лучшее решение, чем у меня.

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 
2

Это решение Oracle для понедельника.

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

Вот примеры, которые извлекают любой конкретный день с предыдущей недели.

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; 

Если вам нужна часть времени, чтобы быть 00:00:00, заверните статут в TRUNC (...).

1

(Oracle)

TRUNC (SYSDATE, 'IW') --gives На этой неделе в понедельник

TRUNC (Sysdate, 'IW') - 7 --gives понедельник на прошлой неделе

Этот предполагает, что вы считаете понедельник первым днем ​​недели, что означает «IW» (неделя ИСО). Если вы считаете, воскресенье, чтобы быть в первый день недели ...

TRUNC (SYSDATE, «W») + 1 --gives понедельник на этой неделе, в воскресенье, это будет в будущем

СТВОЛА (sysdate, 'W') + 1-7 - на прошлой неделе