3

我需要 Oracle SQL 或 T-SQL 中的日期公式,它将返回前一周的日期(例如上周一的日期)。

我有每周运行的参数报告,通常使用参数日期为前一周的周一至周五或周日至周六。我不想在每周运行报告时输入日期。

数据在 Oracle 中,我使用 SQL Server 2005 Reporting Services (SSRS) 进行报告。

4

7 回答 7

2

Here is an Oracle solution for Monday.

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

Here are examples that retrieve any particular day from the previous week.

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;

If you need the time part to be 00:00:00 wrap the statment in TRUNC(...).

于 2008-10-27T17:32:56.690 回答
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 回答
1

查看这篇文章中的日期函数列表。你想要这个。

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

它们几乎总是数学而不是面向字符串的,因此它们比套管或铸造操作工作得更快

于 2008-10-27T15:47:50.287 回答
1

(甲骨文)

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

这是我的解决方案,经过 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”是返回一周(-7),然后由于星期一是 2,我们再减去 2 并添加当天的星期几。

于 2008-10-27T15:54:26.437 回答