update_time >= concat(date_format(date_sub(current_timestamp,interval ${manag_month_inc} month),'%Y-%m'),'-01')
时间: 2024-04-07 12:28:37 浏览: 164
这是一个 SQL 查询语句,它的作用是筛选出 update_time 字段大于等于 ${manag_month_inc} 个月前的第一天的记录。其中 ${manag_month_inc} 是一个变量,表示你想要筛选多少个月之前的记录。这个查询语句使用了 date_sub 函数来计算当前日期减去指定月份之后的日期,并使用 date_format 函数将其格式化成年月的形式。然后将其和 '-01' 拼接起来,得到指定月份的第一天,再和 update_time 字段进行比较。
相关问题
优化下这个sql select node_id, node_type, node_name, node_layer, node_group, node_name_isshow, rmu_id, '0' x, '0' y, '0' alarm_level, vendor_id, prkid from public.t_fc_mc_topo_point where ne_id = #{neId} and ne_type = #{topoType} and update_time=concat(cast(current_date as varchar),' 00:00:00')::timestamp
对于这个SQL查询语句,可以考虑以下几个优化点:
1. 索引优化:在t_fc_mc_topo_point表中,可以创建(ne_id, ne_type, update_time)的组合索引,以加快查询效率。
2. 避免函数调用:在SQL语句中使用了函数调用,会增加查询的开销。可以改为直接使用current_date和timestamp类型的转换函数进行比较,例如:
```
update_time >= current_date::timestamp and update_time < (current_date + '1 day'::interval)::timestamp
```
3. 避免不必要的字段查询:在SQL语句中,有些字段查询并没有被使用,可以考虑去掉这些字段的查询,例如:
```
select node_id, node_type, node_name, node_layer, node_group, node_name_isshow, rmu_id, vendor_id, prkid
```
综上所述,可以优化后的SQL查询语句如下:
```
select node_id, node_type, node_name, node_layer, node_group, node_name_isshow, rmu_id, vendor_id, prkid
from public.t_fc_mc_topo_point
where ne_id = #{neId}
and ne_type = #{topoType}
and update_time >= current_date::timestamp
and update_time < (current_date + '1 day'::interval)::timestamp
```
修改完整版的sql存储(积分兑换脚本),改写出可执行的shell create procedure "rptdev"."sp_wjq_jf_value_dhfz_show"( in @data_date integer default cast("dateformat"("now"()-1,'yyyymmdd') as integer), in @is_run_flag1 integer default 1, in @is_run_flag2 integer default 10 ) on exception resume /****************************************************************** -- Purpose : 兑换积分分析报表 -- Auther: xxx -- Date : 20210923 *******************************************************************/ begin declare @stat_date varchar(8); --统计日期 declare @month_id integer; --统计月份 declare @month_first_date varchar(8); --统计月的第一天 declare @month_last_date varchar(8); --统计月的最后一天 declare @last_month_first_date varchar(8); --上月的第一天 declare @last_month_last_date varchar(8); --上月的最后一天 declare @last_month integer; --上月 declare @last_last_month integer; --上上月 declare @last_month_this_day varchar(8); --上月当天 declare @last_year_this_month integer; --上年当月 declare @this_year_first_month integer; --本年首月 declare @last_year_last_month integer; --上年尾月 set @stat_date = convert(varchar(8),@data_date); set @month_id = @data_date/100; set @month_first_date = "dateformat"(@data_date,'yyyymm01'); --统计月的第一天 set @month_last_date = "dateformat"("dateadd"("dd",-1,"dateformat"("dateadd"("mm",1,@data_date),'yyyymm01')),'yyyymmdd'); --统计月的最后一天 set @last_month_first_date = "dateformat"("dateadd"("mm",-1,@data_date),'yyyymm01'); --上月第一天 set @last_month_last_date = "dateformat"("dateadd"("dd",-1,"dateformat"("dateadd"("mm",1,@data_date),'yyyymm01')),'yyyymmdd'); set @last_month = cast("dateformat"("dateadd"("month",-1,@data_date),'yyyymm') as integer); --上月 set @last_last_month = cast("dateformat"("dateadd"("month",-2,@data_date),'yyyymm') as integer); --上上月 set @last_month_this_day = "dateformat"("dateadd"("mm",-1,convert(date,@data_date)),'yyyymmdd'); --上月当天 set @last_year_this_month = convert(integer,"dateformat"("dateadd"("yy",-1,@last_month_this_day),'yyyymm')); --上年当月 set @this_year_first_month
Here's a modified version of the SQL code in a shell script that can be executed:
```
#!/bin/bash
mysql -u <username> -p<password> -e "CREATE PROCEDURE rptdev.sp_wjq_jf_value_dhfz_show(
IN data_date INTEGER DEFAULT CAST(DATE_FORMAT(NOW() - INTERVAL 1 DAY, '%Y%m%d') AS INTEGER),
IN is_run_flag1 INTEGER DEFAULT 1,
IN is_run_flag2 INTEGER DEFAULT 10
)
BEGIN
DECLARE stat_date VARCHAR(8);
DECLARE month_id INTEGER;
DECLARE month_first_date VARCHAR(8);
DECLARE month_last_date VARCHAR(8);
DECLARE last_month_first_date VARCHAR(8);
DECLARE last_month_last_date VARCHAR(8);
DECLARE last_month INTEGER;
DECLARE last_last_month INTEGER;
DECLARE last_month_this_day VARCHAR(8);
DECLARE last_year_this_month INTEGER;
DECLARE this_year_first_month INTEGER;
DECLARE last_year_last_month INTEGER;
SET stat_date = CONVERT(VARCHAR(8), data_date);
SET month_id = data_date / 100;
SET month_first_date = DATE_FORMAT(data_date, '%Y%m01');
SET month_last_date = DATE_FORMAT(DATE_ADD(DATE_FORMAT(DATE_ADD(data_date, INTERVAL 1 MONTH), '%Y%m01'), INTERVAL -1 DAY), '%Y%m%d');
SET last_month_first_date = DATE_FORMAT(DATE_ADD(data_date, INTERVAL -1 MONTH), '%Y%m01');
SET last_month_last_date = DATE_FORMAT(DATE_ADD(DATE_FORMAT(DATE_ADD(data_date, INTERVAL 1 MONTH), '%Y%m01'), INTERVAL -1 DAY), '%Y%m%d');
SET last_month = CAST(DATE_FORMAT(DATE_ADD(data_date, INTERVAL -1 MONTH), '%Y%m') AS INTEGER);
SET last_last_month = CAST(DATE_FORMAT(DATE_ADD(data_date, INTERVAL -2 MONTH), '%Y%m') AS INTEGER);
SET last_month_this_day = DATE_FORMAT(DATE_ADD(data_date, INTERVAL -1 MONTH), '%Y%m%d');
SET last_year_this_month = CONVERT(INTEGER, DATE_FORMAT(DATE_ADD(last_month_this_day, INTERVAL -1 YEAR), '%Y%m'));
SET this_year_first_month = CAST(DATE_FORMAT(CONCAT(YEAR(data_date), '0101'), '%Y%m') AS INTEGER);
SET last_year_last_month = CAST(DATE_FORMAT(DATE_ADD(CONCAT(YEAR(data_date), '0101'), INTERVAL -1 DAY), '%Y%m') AS INTEGER);
END;"
```
Note: Replace `<username>` and `<password>` with your MySQL username and password respectively.
阅读全文