Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果日期值在周末,则重置日期值

如果日期值在周末,则重置日期值
EN

Stack Overflow用户
提问于 2019-06-20 15:55:50
回答 2查看 62关注 0票数 0

我正在编写一个过程,并使用动态游标和SQL查询,我将它们作为字符串传递到V_SQL变量中。查询如下:

在where条件下,我正在传递日期,但条件是,如果是月末,并且落在周五、周六或周日,则将其重置为周四。例如,6月30日将是星期天,因此在SQL查询中传递给day_of_month的值应该是27,即从星期四开始的第27天。

你能告诉我写单独的函数是否好,我应该放什么代码来获得更好的性能和期望的结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
V_SQL := 'SELECT B.FIN_ELEM, A.ORG_UNIT_ID, A.GL_ACCOUNT_ID, B.CMN_COA_ID, B.PROD1, B.PROD2, B.PROD3, '||
'A.AS_OF_DATE, SUM(CURRENT_BAL) AS CB_SUM, SUM(AVG_BAL) AS AB_SUM, B.FLAG1 FROM DAILYGL A, AL_LOOKUP B '||
'WHERE A.GL_ACCOUNT_ID = B.GL_ACCT ***AND DAY_OF_MONTH = '|| TO_DO_FUNCTION(V_RUN_DATE)***

' AND ROWNUM <=15 GROUP BY B.FIN_ELEM, A.ORG_UNIT_ID, A.GL_ACCOUNT_ID,B.CMN_COA_ID, B.PROD1, B.PROD2, B.PROD3';

DAY_OF_MONTH = '|| TO_DO_FUNCTION(V_RUN_DATE)

如果最后一个工作日在周五、周六或周日,则预期结果将通过周四的天数。

EN

回答 2

Stack Overflow用户

发布于 2019-06-20 16:12:46

我希望这能解决你的问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
V_RUN_DATE - (case when V_RUN_DATE > LAST_DAY (V_RUN_DATE)- 3 then  V_RUN_DATE else  
 (case TO_CHAR(date V_RUN_DATE, 'DY') when  'FRI' then 1 when 'SAT' then 2 when 'SUN' then 3 else 0 end) end)
票数 0
EN

Stack Overflow用户

发布于 2019-06-20 17:03:48

你并不真的需要一个函数,你可以用一个case表达式来实现,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AND DAY_OF_MONTH = case
    when last_day(v_run_date) - v_run_date <= 3
      and to_char(v_run_date, 'Dy', 'NLS_DATE_LANGUAGE=ENGLISH') in ('Fri', 'Sat', 'Sun')
      and to_char(last_day(v_run_date), 'Dy', 'NLS_DATE_LANGUAGE=ENGLISH') in ('Fri', 'Sat', 'Sun')
    then next_day(trunc(v_run_date, 'IW'), 'THURSDAY')
    else v_run_date
  end

也就是说,如果v_run_date在一个月的最后一天的三天之内,并且v_run_date是星期五、星期六或星期日,并且一个月的最后一天是星期五、星期六或星期日,则使用该周的星期四的日期。

包含今年全年生成日期的演示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with cte (v_run_date) as (
  select date '2018-12-31' + level
  from dual
  connect by level <= 365
)
select v_run_date,
  to_char(v_run_date, 'Dy', 'NLS_DATE_LANGUAGE=ENGLISH') as dy,
  case
    when last_day(v_run_date) - v_run_date <= 3
      and to_char(v_run_date, 'Dy', 'NLS_DATE_LANGUAGE=ENGLISH') in ('Fri', 'Sat', 'Sun')
      and to_char(last_day(v_run_date), 'Dy', 'NLS_DATE_LANGUAGE=ENGLISH') in ('Fri', 'Sat', 'Sun')
    then next_day(trunc(v_run_date, 'IW'), 'THURSDAY')
    else v_run_date
  end as adjusted_date
from cte;

V_RUN_DATE DY           ADJUSTED_D
---------- ------------ ----------
2019-01-01 Tue          2019-01-01
2019-01-02 Wed          2019-01-02
...
2019-01-30 Wed          2019-01-30
2019-01-31 Thu          2019-01-31
2019-02-01 Fri          2019-02-01
2019-02-02 Sat          2019-02-02
...
2019-03-26 Tue          2019-03-26
2019-03-27 Wed          2019-03-27
2019-03-28 Thu          2019-03-28
2019-03-29 Fri          2019-03-28
2019-03-30 Sat          2019-03-28
2019-03-31 Sun          2019-03-28
2019-04-01 Mon          2019-04-01
...
2019-04-30 Tue          2019-04-30
2019-05-01 Wed          2019-05-01
...
2019-05-28 Tue          2019-05-28
2019-05-29 Wed          2019-05-29
2019-05-30 Thu          2019-05-30
2019-05-31 Fri          2019-05-30
2019-06-01 Sat          2019-06-01
2019-06-02 Sun          2019-06-02
...
2019-06-26 Wed          2019-06-26
2019-06-27 Thu          2019-06-27
2019-06-28 Fri          2019-06-27
2019-06-29 Sat          2019-06-27
2019-06-30 Sun          2019-06-27
2019-07-01 Mon          2019-07-01
...
2019-07-31 Wed          2019-07-31
2019-08-01 Thu          2019-08-01
...
2019-08-28 Wed          2019-08-28
2019-08-29 Thu          2019-08-29
2019-08-30 Fri          2019-08-29
2019-08-31 Sat          2019-08-29
2019-09-01 Sun          2019-09-01
...
2019-11-27 Wed          2019-11-27
2019-11-28 Thu          2019-11-28
2019-11-29 Fri          2019-11-28
2019-11-30 Sat          2019-11-28
2019-12-01 Sun          2019-12-01
...

db<>fiddle

正如在注释中提到的,您的代码看起来不需要是动态的;您可以使用静态SQL来显示您所显示的内容,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT *
-- into ...
FROM (
  SELECT B.FIN_ELEM, A.ORG_UNIT_ID, A.GL_ACCOUNT_ID,
    B.CMN_COA_ID, B.PROD1, B.PROD2, B.PROD3, A.AS_OF_DATE,
    SUM(CURRENT_BAL) AS CB_SUM, SUM(AVG_BAL) AS AB_SUM, B.FLAG1
  FROM DAILYGL A
  JOIN AL_LOOKUP B ON B.GL_ACCT = A.GL_ACCOUNT_ID
  WHERE DAY_OF_MONTH = case
      when last_day(v_run_date) - v_run_date <= 3
        and to_char(v_run_date, 'Dy', 'NLS_DATE_LANGUAGE=ENGLISH') in ('Fri', 'Sat', 'Sun')
        and to_char(last_day(v_run_date), 'Dy', 'NLS_DATE_LANGUAGE=ENGLISH') in ('Fri', 'Sat', 'Sun')
      then next_day(trunc(v_run_date, 'IW'), 'THURSDAY')
      else v_run_date
    end
  GROUP BY B.FIN_ELEM, A.ORG_UNIT_ID, A.GL_ACCOUNT_ID,B.CMN_COA_ID, B.PROD1, B.PROD2, B.PROD3
  -- order by something...
)
WHERE ROWNUM <= 15;

我还切换到了ANSI join,但更重要的是将主查询移到了一个内联视图中,然后对其应用了rownum过滤器;除非/直到您在该内联视图中添加一个order-by子句,否则不会有任何影响。如果没有它,这个和你的原始,将得到一个不确定的(不是很随机的,但类似的效果) 15行的集合。如果您对内部查询进行排序,那么您将始终根据您的排序条件获得前15行。从12c开始,您可以使用a row limiting clause来代替subquery/rownum筛选器,但这种方法可以在早期版本中使用。

显然,您仍然需要将其选择为变量,或者将其用作游标查询-无论您计划动态执行什么操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56689780

复制
相关文章
[随缘一题]平面列表
给定一个列表,该列表中的每个要素要么是个列表,要么是整数。将其变成一个只包含整数的简单列表。
呼延十
2019/07/01
5040
LintCode 平面列表题目分析代码
给定一个列表,该列表中的每个要素要么是个列表,要么是整数。将其变成一个只包含整数的简单列表。 ** 注意事项 ** 如果给定的列表中的要素本身也是一个列表,那么它也可以包含列表。 样例 给定 [1,2,[1,2]],返回 [1,2,1,2]。 给定 [4,[3,[2,[1]]]],返回 [4,3,2,1]。
desperate633
2018/08/22
3020
如何在Dart中合并列表
在 Dart 编程中,List 数据类型类似于其他编程语言中的数组。列表用于表示对象的集合。它是一组有序的对象。Dart 中的核心库负责 List 类的存在、创建和操作。有 5 种方法可以组合两个或多个列表:
徐建国
2021/12/01
2.1K0
fastadmin如何在列表的操作中添加其他按钮
fastadmin默认的列表操作中只有编辑和删除按钮,如果我们需要添加其他按钮,需要先找到对应的js文件。我们需要在初始化表格中添加buutons属性,原来的js代码如下:
高久峰
2023/06/03
4.3K0
如何在列表,字典、集合中筛选数据——进阶学习
我们先生成一个字典,比如生成班上学上的成绩,班上有10个人,我们要进行筛选分数及格的同学
Gorit
2021/12/09
2.2K0
如何在列表,字典、集合中筛选数据——进阶学习
如何在 Python 中以表格格式打印列表?
在 Python 中,列表是一种常见的数据结构,用于存储和组织数据。当我们需要将列表的内容以表格形式展示时,可以通过特定的方法和技巧来实现。本文将详细介绍如何在 Python 中以表格格式打印列表,以便更好地展示和呈现数据。
网络技术联盟站
2023/06/01
1.6K0
如何在CSS中自定义鼠标样式
想着美化下自己的个人部落格,那就先从鼠标样式开始美化吧,默认的鼠标样式有点单调,那应该如何美化呢?
用户1094633
2022/02/14
2.3K0
【说站】Python如何在列表中添加新值
1、append()将元素添加到集合,insert()将元素插入指定的下标应用程序,返回值为None。
很酷的站长
2022/11/24
4.1K0
【说站】Python如何在列表中添加新值
如何在Vscode中安装Python库
检查是否正确配置好运行环境,按Windows+R组合键在运行窗口输入cmd,打开命令提示符窗口输入python确定即可
程序员鑫港
2022/01/11
2.5K0
如何在Vscode中安装Python库
检查是否正确配置好运行环境,按Windows+R组合键在运行窗口输入cmd,打开命令提示符窗口输入python确定即可
程序员鑫港
2021/12/23
7.1K0
如何在SwiftUI中实现interactiveDismissDisabled
由于健康笔记[2]中数据录入都是在Sheet中进行的,为了防止用户在录入过程中由于误操作(使用手势取消Sheet)丢失数据,因此,从最初的版本开始,我就一直使用各种手段加强对Sheet的控制。
东坡肘子
2022/07/28
3.9K0
如何在SwiftUI中实现interactiveDismissDisabled
如何在 MongoDB 中实现事务
在 MongoDB 中,事务可以用于在一个或多个集合上执行多个操作。事务可以帮助确保数据的一致性和可靠性。
玖叁叁
2023/04/14
2.6K0
【HTML】HTML 列表 ( 无序列表 | 有序列表 | 自定义列表 )
列表 由于其 整齐 , 整洁 , 有序 的特征 , 类似于表格 , 但是其 组合的自由程度高于表格 , 经常用来进行布局 ;
韩曙亮
2023/03/30
3K0
【HTML】HTML 列表 ( 无序列表 | 有序列表 | 自定义列表 )
如何在 Python 中计算列表中的唯一值?
Python 提供了各种方法来操作列表,这是最常用的数据结构之一。使用列表时的一项常见任务是计算其中唯一值的出现次数,这在数据分析、处理和筛选任务中通常是必需的。在本文中,我们将探讨四种不同的方法来计算 Python 列表中的唯一值。
很酷的站长
2023/08/11
3890
如何在 Python 中计算列表中的唯一值?
html 有序列表、无序列表、自定义列表
HTML有一个特殊元素,用于创建ordered lists(有序列表), 或数字编号列表。 有序列表以<ol>元素开始,并包含一个或多个<li>元素。 例如:
Devops海洋的渔夫
2019/05/31
4.1K0
在iview中实现列表远程排序
iview中可以通过给列表中每个字段设置sortable: true可以实现字段排序,但是当列表中的数据量比较多时,列表中会有分页,此时只能对当前页进行排序,针对这个问题,iview中有一个远程排序功能,可以通过远程排序实现多页数据的排序
用户3880999
2023/04/13
1.9K0
在iview中实现列表远程排序
列表(List)中数组实现(ArrayList类)
同样基于数组实现,会在内存中开辟一块连续的空间来存储。ArrayList是非线程安全的,效率高;Vector是基于线程安全的,但效率低,并且是方法级别的同步,不是绝对的线程安全。   初始容量10,每次数组扩展到原来容量的2倍(每次扩充的容量大小是可以设置的,而ArrayList类不支持设定)。
用户7999227
2021/10/07
9400
点击加载更多

相似问题

如何在自定义类中实现映射/平面映射

13

如何在列表上实现此筛选

11

如何在ExtJS中实现此自定义网格?

10

如何在Django中实现此数据库模型?

11

如何在tensorflow中实现此自定义损失函数?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文