在SQL条件下检查两个日期是否在同一会计年度?

时间:2017-10-27 14:28:04

标签: mysql sql triggers

在创建限制同一财政年度数据修改的触发限制时,我需要检查2个日期(NEW.starting_date&amp; OLD.starting_date)是否位于同一会计年度或不在我的条件部分。< / p>

我的桌子是这样的。

pid  (int)    |    data (varchar)      |   starting_date (date)

1             |          abc           |  2017-09-08
2             |          def           |  2017-03-13
3             |          ghi           |  2017-07-12

条件

NEW.data<>OLD.data
  AND (
      (YEAR(NEW.starting_date) = YEAR(OLD.starting_date) 
AND MONTH(NEW.starting_date)<=4 AND MONTH(OLD.starting_date) <=4
AND MONTH(NEW.starting_date)>=3 AND MONTH(OLD.starting_date) >=3)

OR 

(ABS(YEAR(NEW.starting_date)-YEAR(OLD.starting_date)) = 1
AND MONTH(NEW.starting_date)<=3 AND MONTH(OLD.starting_date) >=4
AND MONTH(NEW.starting_date)>=4 AND MONTH(OLD.starting_date) <=3)
)

                                                                                              )
  

注意:财政年度从每年的4月1日开始。

问题:

  1. 此条件无法正常工作。可能是什么问题?
  2. 有没有其他有效的方法可以做到这一点。
  3. 数据库服务器

    Server: 127.0.0.1 via TCP/IP
    Server type: MariaDB
    Server version: 10.1.25-MariaDB - mariadb.org binary distribution
    Protocol version: 10
    User: root@localhost
    Server charset: UTF-8 Unicode (utf8)
    

    网络服务器

    Apache/2.4.26 (Win32) OpenSSL/1.0.2l PHP/5.6.31
    Database client version: libmysql - mysqlnd 5.0.11-dev - 20120503 - $Id: 76b08b24596e12d4553bd41fc93cccd5bac2fe7a $
    

3 个答案:

答案 0 :(得分:2)

我现在无法使用过滤器进行测试,但这是两个日期的财务年度之间的快速比较:

SET @start_date = '2016-03-11';
SET @end_date = '2016-04-11';
SELECT IF(
(SELECT IF(MONTH(@start_date)>=4, YEAR(@start_date), YEAR(@start_date)-1))
=
(SELECT IF(MONTH(@end_date)>=4, YEAR(@end_date), YEAR(@end_date)-1))
, 'Same fiscal year', 'Different fiscal year');

答案 1 :(得分:1)

对于问题的第一部分 - 为什么你的病情没有达到预期的效果。在第一部分中,两个日期都在同一年,您只比较3月和4月。而第二部分只是错误地混合上一年和明年 - 你必须摆脱ABS并分成两个OR条件

修正:

NEW.data<>OLD.data
AND 
(
   (
      YEAR(NEW.starting_date) = YEAR(OLD.starting_date) 
      AND
      ( 
         (MONTH(NEW.starting_date)<=3 AND MONTH(OLD.starting_date)<=3)
         OR
         (MONTH(NEW.starting_date)>=4 AND MONTH(OLD.starting_date)>=4)
      )
   )
   OR 
   (
      YEAR(NEW.starting_date)-YEAR(OLD.starting_date) = 1
      AND 
      MONTH(NEW.starting_date)<=3 AND MONTH(OLD.starting_date) >=4
   )
   OR
   (
      YEAR(NEW.starting_date)-YEAR(OLD.starting_date) = -1
      AND 
      MONTH(NEW.starting_date)>=4 AND MONTH(OLD.starting_date) <=3
   )
)

编辑 - 对于问题的第二部分 - 基于Samuil Banti的回答,更有效的方式,转换为CASE声明:

NEW.data<>OLD.data
AND CASE WHEN MONTH(NEW.starting_date) >= 4 
           THEN YEAR(NEW.starting_date) ELSE YEAR(NEW.starting_date) - 1
    END 
= CASE WHEN MONTH(OLD.starting_date) >= 4 
           THEN YEAR(OLD.starting_date) ELSE YEAR(OLD.starting_date) - 1
    END 

答案 2 :(得分:0)

您可以提取其中一个日期的年份,然后添加-04-01以获取当前财政年度的开始日期或结束日期。

DATE(DATE_ADD(CONCAT(YEAR(NEW.starting_date),'-','04-01'), INTERVAL 1 YEAR))
// OR
DATE(DATE_SUB(CONCAT(YEAR(NEW.starting_date),'-','04-01'), INTERVAL 1 YEAR))

然后将这些值与OLD.starting_date

进行比较