3

I need a date formula in Oracle SQL or T-SQL that will return a date of the previous week (eg Last Monday's date).

I have reports with parameters that are run each week usually with parameter dates mon-friday or sunday-saturday of the previous week. I'd like to not have to type in the dates when i run the reports each week.

The data is in Oracle and I am using SQL Server 2005 Reporting Services (SSRS) for the reports.

4

7 に答える 7

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. */
于 2008-10-27T15:47:21.583 に答える
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(...)でラップします。

于 2008-10-27T17:32:56.690 に答える
1

(Oracle)

trunc(sysdate、'IW')-今週の月曜日を示します

trunc(sysdate、'IW')-7--先週の月曜日を与える

これは、月曜日を週の最初の日と見なすことを前提としています。これは、「IW」(ISO週)が意味するものです。日曜日を週の最初の日と見なす場合...

trunc(sysdate、'W')+ 1-今週の月曜日を与えます、日曜日にこれは将来になります

trunc(sysdate、'W')+1-7--先週の月曜日を与える

于 2008-10-27T18:40:48.503 に答える
1

この投稿の日付関数のリストを確認してください。これが欲しい。

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

それらはほとんどの場合数学であり、文字列指向ではないため、ケーシングやキャスト操作よりも高速に動作します

于 2008-10-27T15:47:50.287 に答える
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'

これらのソリューションの多くは、同じ週の日曜日と月曜日に同じ答えを提供します。古い月曜日は、別の月曜日が発生するまで辞任しないでください。

于 2008-10-27T15:57:06.163 に答える
0

オラクルの場合:

編集:もう少し簡潔に

編集: 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
于 2008-10-27T16:38:34.303 に答える
-1

T-SQLソリューション:

SET DATEFIRSTがデフォルト(日曜日= 7)であると仮定すると、先週の月曜日の日付は次のようになります。

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

「-9」は1週間前(-7)に戻り、月曜日が2なので、さらに2を減算し、現在の曜日の曜日を加算します。

于 2008-10-27T15:54:26.437 に答える