【问题标题】:Stored Procedure: Get month存储过程:获取月份
【发布时间】:2023-03-21 19:00:01
【问题描述】:

我正在尝试创建一个存储过程,当给定月份值时,它会返回用户该月的最后一天。

到目前为止:

DROP PROCEDURE IF EXISTS getLastDayMonth$$
CREATE PROCEDURE getLastDayMonth(IN inMonth int) 
BEGIN
    SELECT LAST_DAY(inMonth);
END $$

我无法弄清楚如何使inMonth 成为sql 函数Last_DAY 接受的参数。是否有另一个函数将 int 作为一个月并返回该月的最后一天?我试图避免将 DATE 类型作为参数

【问题讨论】:

  • inMonth 应该代表哪一年的哪一个月?今年、去年、明年……? (3 月到 1 月不一定重要,但对于 2 月,年份至关重要!)
  • inMonth 应该是任意月份,只要可以返回最后一天,年份并不重要。我了解 2 月的问题,但是 Last_Day 函数可以为第 02 个月提供的任何内容都可以
  • 出于好奇:最后一天的用途是什么?作为用户,我会有点困惑,如果程序会在 2 月 28 日而不是 29 日返回我,反之亦然......

标签: mysql function stored-procedures


【解决方案1】:

您可以在第一年的第一天添加飞蛾并获取 last_date:

SELECT LAST_DAY( DATE_ADD( '2012-01-01 00:00:00',  
                           INTERVAL inMonth - 1 MONTH) 
               );

替代方案是ELT函数:

SELECT cast( 
         ELT(inmonth, '31', '28', '31', '30', '31', .... ,'31' )
         as SMALLINT 
       ) as last_day

最后一个,使用case声明:

SELECT case inmonth
        when 1 then 31
        when 2 then 29
        ...
        when 12 then 31
       end as last_day

已编辑

mysql> CREATE PROCEDURE getLastDayMonth(IN inMonth int)
    -> begin
    -> SET @t=inMonth -1;
    -> SELECT LAST_DAY( DATE_ADD( '2012-01-01 00:00:00',INTERVAL @t MONTH));
    -> end@@
Query OK, 0 rows affected (0.24 sec)

【讨论】:

  • @danihp 我正在尝试测试您的第一个解决方案,但我不断收到 mysql 语法错误,DATE_ADD 函数是否假设将 -1 作为变量?
  • 我添加了 DAY 函数,因为 Last_Day 返回一个日期。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 2017-01-18
  • 2017-01-01
相关资源
最近更新 更多