日志文件对于任何应用程序都是非常重要的,许多操作都需要记录到日志,然后可以利用日志文件查错纠错等。

今天在工作中遇到了一个很实际的问题,客户在OA接口的员工休假中间表中提供了连续时间段的休假记录,例如:
张三,2018-12-1 ~2018-12-31
,病假,31天。这样带来的问题是,如果我需要统计张三从12月1号到12月15号的休假天数,单从这一整条连续记录是无法统计的。这时候就需要我们将一条长记录进行拆分。

定义异常捕获类型及处理方法:

mysql中当然也有日志,mysql的日志大概分为五种,即错误日志、查询日志、慢查询日志、二进制日志和事务日志。

这里记录下我自己的思路:

图片 1😉

查看日志相关的全局变量。

1:利用系统表得到0-2047的序列 ,2048*2048绝对够用了吧

    DECLARE handler_action HANDLER  
        FOR condition_value [, condition_value] ...  
        statement  

    handler_action:  
        CONTINUE  
      | EXIT  
      | UNDO  

    condition_value:  
        mysql_error_code  
      | SQLSTATE [VALUE] sqlstate_value  
      | condition_name  
      | SQLWARNING  
      | NOT FOUND  
      | SQLEXCEPTION  
-- 查询日志相关全局变量
show global variables like '%log%';
SELECT sv.number AS n FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P'

图片 2😉

 

结果如图:

这里面需要注意几点:

一、错误日志

图片 3

  a、condition_value
[,condition_value],这个的话说明可以包括多种情况(方括弧表示可选的),也就是一个handler可以定义成针对多种情况进行相应的
操作;另外condition_value可以包括的值有上面列出来的6种:

在mysql数据库中,错误日志功能是默认开启的,并且,错误日志无法被禁止。

2:利用CROSS APPLY  得到最终序列(从1开始,最后一行是2048*2048)

               
1、mysql_error_code,这个表示mysql的错误代码,错误代码是一个数字,完成是由mysql自己定义的,这个值可以参考mysql数据库错误代码及信息。

mysql的日志主要记录服务器启动和关闭过程的信息、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息等。

WITH
 t1 AS (SELECT sv.number AS n FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P'),
 t2 AS ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rid  FROM t1 AS a CROSS APPLY t1 AS b)
----------------- 
SELECT *FROM t2 

                2、SQLSTATE [VALUE]
sqlstate_value,这个同错误代码类似形成一一对应的关系,它是一个5个字符组成的字符串,关键的地方是它从ANSI
SQL和ODBC这些标准中引用过来的,因此更加标准化,而不像上面的error_code完全是mysql自己定义给自己用的,这个和第一个类似也可以
参考mysql数据库错误代码及信息。

-- 查看错误日志文件的地址
show global variables like 'log_error';

-- 查看警告信息是否也写入到错误日志中,默认值为2。如果要启用,将其值设置为1;如果要禁用,将其值设置为0。
show global variables like 'log_warnings';

结果如图

               
3、condtion_name,这个是条件名称,它使用DECLARE…CONDITION语句来定义,这个后面我们会介绍如何定义自己的condition_name。

mysqladmin命令重新创建一个新的错误日志文件。

图片 4

               
4、SQLWARNING,表示SQLTATE中的字符串以‘01’起始的那些错误,比如Error: 1311 SQLSTATE: 01000 (ER_SP_UNINIT_VAR)

-- mysqladmin命令重新创建一个新的错误日志文件,原错误日志文件加上后缀old
mysqladmin -u root -p flush-logs

你千万别告诉我400多万都不够你拆的啊,小心我揍你

                5、NOT
FOUND,表示SQLTATE中的字符串以‘02’起始的那些错误,比如Error: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA)

sql语句重新创建一个新的错误日志文件。

3:奉上完整代码

               
6、SQLEXCEPTION,表示SQLSTATE中的字符串不是以’00’、’01’、’02’
起始的那些错误,这里’00’起始的SQLSTATE其实表示的是成功执行而不是错误,另外两个就是上面的4和5的两种情况。

-- 重新创建一个新的错误日志文件,原错误日志文件加上后缀old
flush logs;

 

上面的6种情况其实可以分为两类:

 

DECLARE @begindate DATE =CAST('2017-12-1' AS date)
DECLARE @enddate DATE =CAST('2017-12-31' AS date)
BEGIN 

WITH
 t1 AS (SELECT sv.number AS n FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P'),
 t2 AS ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rid  FROM t1 AS a CROSS APPLY t1 AS b)
----------------- 
--SELECT *FROM t2 

SELECT 
DATEADD(DAY,t2.rid-1,@begindate) as date
FROM t2 
WHERE t2.rid BETWEEN -1 AND (DATEDIFF(DAY,@begindate,@enddate)+1)
END 

发表评论

电子邮件地址不会被公开。 必填项已用*标注