【问题标题】:Get first and last day of month into variables - Oracle将月份的第一天和最后一天放入变量中 - Oracle
【发布时间】:2019-12-18 06:27:39
【问题描述】:

我想在 Oracle 中声明一些包含当月第一天和最后一天的变量。我知道如何获取这些值,但显然不存储或使用它们;我更像是一个 T-SQL 人。

在 T-SQL 中,我可以这样写:

DECLARE @startDate DATE = GETDATE();
DECLARE @endDate DATE = EOMONTH(GETDATE());

SELECT *
FROM SomeTable
WHERE SomeDate BETWEEN @startDate AND @endDate;

我一辈子都无法弄清楚如何在 Oracle 中执行此操作。我尝试了几种变体,例如:

DECLARE END_DT DATE := TRUNC(LAST_DAY(SYSDATE))
END_DT DATE := TRUNC(LAST_DAY(SYSDATE))

DECLARE END_DT DATE;
SELECT TRUNC(LAST_DAY(SYSDATE)) INTO END_DT FROM DUAL;

我主要使用 11g,但我也希望能够在 9i/10g 服务器上使用相同的脚本。

【问题讨论】:

  • 我认为一个简单的谷歌搜索可以为您返回所需的结果。见mandsconsulting.com/…
  • @XING 我猜你没有完整阅读我的帖子。
  • 您的文本和 T-SQL 相互矛盾。 getdate() 获取当前日期(和时间)而不是当月的第一天。你真正想要哪一个?
  • @stickybit 这只是一个例子。不想写 dateadd.... 等
  • @TaylorN 您可以在DECLARE 之后使用BEGINEND 将值存储在变量中。正如您所提到的,您有第一天和最后一天的查询,只需使用该块来分配变量,如我的答案所示

标签: sql oracle plsql oracle11g


【解决方案1】:

您可以使用这样的查询来检测当月的第一天和最后一天:

SELECT TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-1)))+1,
       TRUNC(LAST_DAY(SYSDATE)) 
  INTO :startDate,:endDate 
  FROM DUAL;

ADD_MONTHS()函数的贡献

更新:或者使用这个 PL/SQL 代码块:

DECLARE
  startDate date;
  endDate   date;
BEGIN
 startDate := TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-1)))+1;
 endDate   := TRUNC(LAST_DAY(SYSDATE)); 
 DBMS_OUTPUT.PUT_LINE ('startDate :  '||startDate); 
 DBMS_OUTPUT.PUT_LINE ('endDate :  '||endDate);  
END;
/

Demo

【讨论】:

  • 如果我在 Toad 中运行此程序,系统会提示我为变量提供值,我只是将它们留空,但随后出现错误“ORA-01036:非法变量名称/编号”。如果我在 SQL Developer 中运行,我会收到另一个错误:“ORA-01006:绑定变量不存在”
  • 我更喜欢使用 AllRoundAutomations 公司名为 PL/SQL Developer 的产品。我可以在其中很好地看到第一个 SQL,如演示小提琴中所示。对于您的情况,您可以尝试第二个 @TaylorN 。
【解决方案2】:

您可以使用LAST_DAYTRUNC 组合如下:

DECLARE
    START_DT   DATE := TRUNC(SYSDATE, 'MM');
    END_DT     DATE := TRUNC(LAST_DAY(SYSDATE));
BEGIN
--DBMS_OUTPUT.PUT_LINE(START_DT || '   ' || END_DT);
    SELECT
        *
    INTO <...>
    FROM
        SOMETABLE
    WHERE
        SOMEDATE BETWEEN START_DT AND END_DT;

END;
/

干杯!!

【讨论】:

  • 当我运行这个时,我得到一个错误:“PLS-00428:这个 SELECT 语句中应该有一个 INTO 子句”
  • 这只是一个想法。您现在可以看到更新的答案
  • 我认为错误是指选择变量。
  • 是的,您是对的,但是您找到该月的第一天和最后一天的问题已在答案中正确突出显示。!!
  • 这不是我的问题。再次阅读问题。
猜你喜欢
  • 1970-01-01
  • 2018-05-28
  • 2017-10-29
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 2019-03-20
  • 1970-01-01
相关资源
最近更新 更多