暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 一周的开始日期和结束日期的某一特定日期

askTom 2018-03-12
395

问题描述

嗨,汤姆,

我希望sql获取给定日期的星期开始日期和星期结束日期,我的星期从星期六开始,以星期五结束。

例如,

如果给定日期为03/3月/2018,则开始日期为-03/3月/2018,结束日期为09/3月/2018
如果给定日期为04/3月/2018,则开始日期为-03/3月/2018,结束日期为09/3月/2018
如果给定日期为05/3月/2018,则开始日期为-03/3月/2018,结束日期为09/3月/2018

如果给定日期为02/3月/2018,则开始日期为-24/2月/2018,结束日期为03/3月/2018

专家解答

如果您可以控制NLS区域设置 (或者甚至更好: 您想适应它),那么最简单的解决方案是使用TRUNC(SYSDATE,'D') 和TRUNC(SYSDATE,'D') 6:

alter session set nls_territory='saudi arabia';
select today
     , trunc(today,'D') start_date
     , trunc(today,'D') + 6 end_date
  from (select date '2018-02-28'+level today from dual connect by level<=10);
复制


上述查询适用于给定地区的周定义: 该周将在美国的周日开始,在欧洲的周一开始。它将在阿拉伯国家的星期六开始。

如果您想将一周开始到周六进行硬编码,并使其独立于NLS设置,那么您需要做一些更复杂的日期算术,因为TRUNC不接受NLS_TERRITORY作为直接参数:

select today
     , today - mod(to_number(to_char(today,'J')) - 2415026,7) start_date
     , today - mod(to_number(to_char(today,'J')) - 2415026,7) + 6  end_date
  from (select date '2018-02-28'+level today from dual connect by level<=10);
复制


上述查询使用20世纪 (1900年1月6日) 第一个星期六的朱利安日期 (2415026) 作为锚点。(您可以使用最老的 “今天” 之前的任何星期六作为锚。)模 (MOD) 表达式如果今天是星期六,则返回0,如果是星期日,则返回1,依此类推。从今天减去这个偏移量,给出今天之前最接近的星期六。结束日期显然是开始日期加上6天。通过稍微移动锚日期,您可以将任何一天硬编码为一周的第一天。

更正您的示例: 如果今天是02/3月/2018,则开始日期是24/2月/2018,但结束日期是02/3月/2018,而不是03/3月/2018。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论