oracle怎么查询上周的数据(例如今天是周日,我要查询出上个周一到周日的数据)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle怎么查询上周的数据(例如今天是周日,我要查询出上个周一到周日的数据)相关的知识,希望对你有一定的参考价值。

--1、取某天在本周中的第几天(默认周日开始算第1天)
select to_char(to_date('2011-04-11','yyyy-mm-dd'), 'd') from dual;
--2、如果要从周一开始算第1天,需要做一些手脚
--大概思路是:1变成7,2变成1,3变成2......,7变成6
select decode(to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd'),
1,
7,
to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd') - 1)
from dual;

--3、再根据上面的结论倒推到上周时间
select to_date('2011-04-04', 'yyyy-mm-dd') -
decode(to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd'),
1,
7,
to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd') - 1) - 7 + 1,

to_date('2011-04-04', 'yyyy-mm-dd') -
decode(to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd'),
1,
7,
to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd') - 1) - 7 + 1 + 6
from dual;
参考技术A select * from table
where time between (trunc(sysdate-7,'DD')-to_char(sysdate-7,'D')+2) and
(trunc(sysdate-7,'DD')-to_char(sysdate-7,'D')+8)追问

11年4月4号是周一,我要查询上周一至上周日的数据,也就是3月28号至4月3号之间的数据!但是4月3号的数据用你的查询语句是查不出来滴

追答

我在本地测试的时候是好好的,莫非那个环节出问题了!

在 PHP 中获取上周日的日期

【中文标题】在 PHP 中获取上周日的日期【英文标题】:Get last Sunday date in PHP 【发布时间】:2013-02-18 05:56:42 【问题描述】:

我正在使用 cron 作业 为我的数据库生成每周报告。基本上,报告生成脚本是用 PHP 编写的。我安排了一个每日 cron 作业。

我的报告周从星期日开始。

我只希望报告生成脚本生成前一周从上周日到上周一的报告。

举个例子。

今天是 2013 年 3 月 4 日。当脚本运行时,它应该生成 报告时间为 2013 年 2 月 24 日至 2013 年 3 月 3 日。明天,当脚本 运行,它也应该只运行 2013 年 2 月 24 日至 2013 年 3 月 3 日的报告。

如何在我的脚本中自动获取最后一个星期天的日期

目前,我使用以下代码进行硬编码:

$startDate = strtotime("13 January 2013");

$strStartDate = date ("Y-m-d 00:00:00", $startDate);
$strEndDate = date ("Y-m-d 23:59:00", $startDate + (6*24*60*60));

非常感谢任何帮助。谢谢。

【问题讨论】:

***.com/questions/3742820/… 谢谢,但是如何自动提供第二个参数?那么,脚本可以自动运行,它总是会返回上周日的日期吗?例如,当脚本今天运行时,它应该返回 2013 年 2 月 24 日。 is it possible using function? 是什么意思??? 【参考方案1】:

上周日

echo date('Y-m-d',strtotime('last sunday'));

编辑答案:

最后一个星期天

echo date('Y-m-d',strtotime('last sunday -7 days')); 

【讨论】:

这将返回 2013-03-03。但我需要的是2013-02-24。也许我应该说上周日? @J K:最后一个星期日是 3 月 3 日。 @zerkms 我想他想上周日 @zerkms,对不起,我想我应该说我需要上周日去。苏米特,-7?但是,该脚本将每天运行,并且应该始终在上周日返回,直到下周。例如,今天它应该返回 2013-02-24。明天也应该返回 2013-02-24,后天也应该返回 2013-02-24.... 然后在 10 Mac 2013 上,它将开始返回 2013-03-03。 J K,您的意思是您正在实时生产服务器上进行开发和调试吗?哦,我的...【参考方案2】:
<?php
$date=date("Y-m-d");
echo "Current Date : ".$date."<br>";
echo "last Sunday : ".date('Y-m-d', strtotime($date.'last sunday'));
?> 

【讨论】:

【参考方案3】:

简介

老实说,我不确定is it possible using function? 是什么意思,但我想你想要一个通用函数,但我认为一个简单的类也可以解决问题。

观察

它也应该只运行 2013 年 2 月 24 日至 2013 年 3 月 3 日的报告。

请注意,从Sunday 24 Feb 2013Sunday 3 March 20138 days 和大于1 weeks,如果您正在绘制图形或将其用于分析,这可能会导致overlapping 数据。我建议您将其限制为1 weeks,即Sunday, 24 Feb 2013Saturday, 2 March 2013

这就是我的意思

// imagine today is Today is 4 March 2013
$today = DateTime::createFromFormat("d F Y", "4 March 2013");

$date = new PeroidDate();
vprintf("%s to %s", $date->getPeroid($today));

输出

 Sunday, 24 February 2013 to Saturday, 02 March 2013

其他例子

示例 1

// Example
$date = new PeroidDate();
print_r($date->getPeroid());

输出

stdClass Object
(
    [start] => Sunday, 31 March 2013
    [end] => Saturday, 06 April 2013
)

//or
Sunday, 31 March 2013

示例 2

假设您想获取“2 月 14 日之前”before valentine period 的报告

print_r($date->getPeroid(new DateTime("2013-02-14")));

输出

stdClass Object
(
    [start] => Sunday, 03 February 2013
    [end] => Saturday, 09 February 2013
)

示例 3

假设您想要一个日期范围而不是单个范围,例如。你想要January 1stCurrent Time之间的日期(你可能想用它作为选择框)然后你使用PeroidDate::getBetween

print_r($date->getBetween(new DateTime("2013-1-1"), new DateTime()));

输出

Array
(
    [0] => stdClass Object
        (
            [start] => Sunday, 06 January 2013
            [end] => Saturday, 12 January 2013
        )

    [1] => stdClass Object
        (
            [start] => Sunday, 13 January 2013
            [end] => Saturday, 19 January 2013
        )

    [2] => stdClass Object
        (
            [start] => Sunday, 20 January 2013
            [end] => Saturday, 26 January 2013
        )

    [3] => stdClass Object
        (
            [start] => Sunday, 27 January 2013
            [end] => Saturday, 02 February 2013
        )

    [4] => stdClass Object
        (
            [start] => Sunday, 03 February 2013
            [end] => Saturday, 09 February 2013
        )

    [5] => stdClass Object
        (
            [start] => Sunday, 10 February 2013
            [end] => Saturday, 16 February 2013
        )

    [6] => stdClass Object
        (
            [start] => Sunday, 17 February 2013
            [end] => Saturday, 23 February 2013
        )

    [7] => stdClass Object
        (
            [start] => Sunday, 24 February 2013
            [end] => Saturday, 02 March 2013
        )

    [8] => stdClass Object
        (
            [start] => Sunday, 03 March 2013
            [end] => Saturday, 09 March 2013
        )

    [9] => stdClass Object
        (
            [start] => Sunday, 10 March 2013
            [end] => Saturday, 16 March 2013
        )

    [10] => stdClass Object
        (
            [start] => Sunday, 17 March 2013
            [end] => Saturday, 23 March 2013
        )

    [11] => stdClass Object
        (
            [start] => Sunday, 24 March 2013
            [end] => Saturday, 30 March 2013
        )

    [12] => stdClass Object
        (
            [start] => Sunday, 31 March 2013
            [end] => Saturday, 06 April 2013
        )

    [13] => stdClass Object
        (
            [start] => Sunday, 07 April 2013
            [end] => Saturday, 13 April 2013
        )

)

使用的类

class PeroidDate 
    private $format;
    private $interval;

    function __construct() 
        $this->format = "l, d F Y";
        $this->interval = new DateInterval('P7D');
    

    function setFormat($format) 
        $this->format = (string) $format;
    

    function setInterval(DateInterval $format) 
        $this->format = $format;
    

    function getPeroid(\Datetime $date = null) 
        $end = $date ?  : new DateTime();
        $end->modify("Last Sunday");

        print_r($end->format($this->format));

        $start = clone $end;
        $start->sub($this->interval);

        $end->modify("-1 day"); //

        return (object) array(
                "start" => $start->format($this->format),
                "end" => $end->format($this->format)
        );
    

    function getBetween(Datetime $start = null, Datetime $end = null) 
        if ($start > $end)
            throw new InvalidArgumentException("`Start date` Must be greater than `End date`");

        if ($start === null) 
            $start = new DateTime();
            $start->modify("First Sunday of January");
         else 
            $start->modify("First Sunday");
        

        if ($end === null) 
            $end = new DateTime();
            $end->modify("Last Sunday of December");
        

        $range = array();
        while ( $start < $end ) 
            $r = new stdClass();
            $r->start = $start->format($this->format);
            $start->add($this->interval);

            $tmp = clone $start;
            $tmp->modify("-1 day");

            $r->end = $tmp->format($this->format);
            $range[] = $r;
        
        return $range;
    

【讨论】:

【参考方案4】:

使用此代码。

echo date('m/d/Y', strtotime('last Sunday'));

你可以根据今天得到上周日。

【讨论】:

【参考方案5】:

试试这个

$sun =  date('Y-m-d',strtotime('last sunday'));
echo date('Y-m-d', strtotime('last Sunday', strtotime($sun)));

它将返回2013-02-24

【讨论】:

【参考方案6】:

由于这个问题也被标记为 MySql,如果您需要计算查询中的间隔,您可以使用以下内容:

SELECT
  '2013-03-04' - INTERVAL (WEEKDAY('2013-03-04')+1) % 7 DAY - INTERVAL 1 WEEK start_date,
  '2013-03-04' - INTERVAL (WEEKDAY('2013-03-04')+1) % 7 DAY end_date

然后要生成报告,您只需使用 CURDATE():

SELECT *
FROM   your_tables
WHERE  ... AND
       report_date BETWEEN
         CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) % 7 DAY - INTERVAL 1 WEEK
         AND CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) % 7 DAY

【讨论】:

以上是关于oracle怎么查询上周的数据(例如今天是周日,我要查询出上个周一到周日的数据)的主要内容,如果未能解决你的问题,请参考以下文章

Oracle查询今天昨天本周上周本月上月数据

在 PHP 中获取上周日的日期

oracle取每月第几周问题

选择上周内的日期

获取上周一 - 周日的日期:有更好的方法吗?

如何从今天的日期开始到上周结束(Mysql)