2021-11-02

ssm文件上传

前端代码

<input type="file" name="file"  id="input_file" required="required" style="display:inline;"> ( 推荐尺寸: 500 * 500 )

后端代码

package com.hopu.controller;

import com.github.pagehelper.PageInfo;
import com.hopu.bean.Admins;
import com.hopu.bean.Goods;
import com.hopu.bean.PageBean;
import com.hopu.service.AdminService;

import com.hopu.util.UUIDUtil;
import com.sun.xml.internal.ws.util.JAXWSUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("/admin")
public class AdminController {
    @Autowired
    private AdminService adminService;
    //商品添加
    @RequestMapping("/goodSave")
    public String goodSave(Goods goods, MultipartFile file, HttpServletRequest request) throws IOException {
        System.out.println(goods);
        //1,生成文件上传的路径
        String realPath = request.getSession().getServletContext().getRealPath("upload");
        System.out.println("realPath = " + realPath);
        //生成带日期的文件夹名
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String dateFile = sdf.format(new Date());
        System.out.println("dateFile = " + dateFile);
        
        realPath = realPath+"/"+dateFile;
        //判断该文件夹是否存在,
        System.out.println("uploadd = " + realPath);
        //判断文件是否存在
        File uploadFile = new File(realPath);
        System.out.println("uploadFile = " + uploadFile);
        if(!uploadFile.exists()){
            uploadFile.mkdirs();
        }
        //图片生成32位随机数
        String str = file.getOriginalFilename();
        System.out.println("str = " + str);
        String name =   UUIDUtil.getUUID()+str.substring(str.lastIndexOf("."));

        //2,创建要上传的文件对象
        File upFile = new File(uploadFile,name);
        //3,上传文件
        file.transferTo(upFile);
        
        //4.获取文件的相对路径
        String cover ="../upload/"+dateFile+"/"+name;
        goods.setCover(cover);
        System.out.println("goods = " + goods);
        //5.保存数据
        adminService.uploadadd(goods);
        return  "forward:goodList";
    }    
}

描述 用户行为日志表tb_user_log id uid artical_id in_time out_time sign_in 1 101 9001 2021-11-01 10:00:00 2021-11-01 10:00:31 0 2 102 9001 2021-11-01 10:00:00 2021-11-01 10:00:24 0 3 102 9002 2021-11-01 11:00:00 2021-11-01 11:00:11 0 4 101 9001 2021-11-02 10:00:00 2021-11-02 10:00:50 0 5 102 9002 2021-11-02 11:00:01 2021-11-02 11:00:24 0 (uid-用户ID, artical_id-文章ID, in_time-进入时间, out_time-离开时间, sign_in-是否签到) 场景逻辑说明:artical_id-文章ID代表用户浏览的文章的ID,artical_id-文章ID为0表示用户在非文章内容页(比如App内的列表页、活动页等)。 问题:统计202111月每天的人均浏览文章时长(秒数),结果保留1位小数,并按时长由短到长排序。 输出示例: 示例数据的输出结果如下 dt avg_viiew_len_sec 2021-11-01 33.0 2021-11-02 36.5 解释: 11月1日有2个人浏览文章,总共浏览时长为31+24+11=66秒,人均浏览33秒; 11月2日有2个人浏览文章,总共时长为50+23=73秒,人均时长为36.5秒。以下写法:select dt, round(avg(diff),1) avg_viiew_len_sec from ( select uid, date(in_time) dt sum(timestampdiff(SECOND,in_time,out_time)) diff from tb_user_log where dt='2021-11' group by uid,dt )t group by dt order by avg_viiew_len_sec 报错程序异常退出, 请检查代码"是否有数组越界等异常"或者"是否有语法错误" SQL_ERROR_INFO: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'sum(timestampdiff(SECOND,in_time,out_time)) diff\nfrom\n tb_user_log\nwhere dt='' at line 9"
最新发布
03-11
<think>嗯,用户给了我一个SQL查询的问题,他们的代码报错了,需要我帮忙检查。首先,我得仔细看看用户提供的表结构和问题描述。然后,用户还给出了他们尝试的SQL语句以及错误信息,我需要分析哪里出错了。 首先,用户的问题是要统计202111月每天的人均浏览文章时长,单位是秒,保留一位小数,并按时长排序。用户提供的示例数据中,他们计算的是每天所有用户浏览文章的总时长,再除以人数。这里需要注意,artical_id为0的情况应该排除,因为那不是在浏览文章页面。所以,首先需要过滤掉artical_id为0的记录,对吧?不过用户的原始SQL中没有这个条件,这可能是问题之一。但根据用户的示例输出,他们的示例数据中的artical_id都是非零的,所以可能用户的数据里已经排除了这种情况,但原题中可能要求只计算文章页面的浏览时间。所以正确的做法应该是在WHERE子句中添加artical_id != 0的条件。 接下来看用户的SQL代码。他们的子查询部分是这样的: select uid, date(in_time) dt sum(timestampdiff(SECOND,in_time,out_time)) diff from tb_user_log where dt='2021-11' group by uid,dt 这里有几个错误。首先,在字段之间缺少逗号。uid和date(in_time) dt之后应该有一个逗号,然后再是sum(...) diff。用户在这里漏掉了逗号,导致SQL语法错误。这就是错误信息中指出的问题所在,语法错误在sum那一行附近。 然后,where条件中的dt='2021-11'可能也有问题。因为dt在这里是date(in_time)的别名,而原表中的in_time是datetime类型。用户可能想过滤11月份的数据,正确的做法应该是使用in_time的日期在202111月之间。比如,where date_format(in_time, '%Y-%m') = '2021-11',或者更高效的方式是in_time >= '2021-11-01' and in_time < '2021-12-01'。原SQL中的dt是子查询中的别名,而where子句中的dt可能引用的是原表中的字段,这可能不正确,因为原表中的字段是in_time和out_time,而不是dt。所以这里存在逻辑错误,会导致数据过滤不正确或者语法错误。 另外,用户可能在子查询中计算每个用户每天的浏览总时长,但需要确保只计算artical_id不为0的情况。因此,在where子句中除了时间过滤,还应该加上artical_id != 0的条件。 总结一下,用户SQL中的错误点: 1. 子查询中字段之间缺少逗号,导致语法错误。 2. where条件中的dt引用错误,应该使用in_time的月份来判断。 3. 没有过滤artical_id为0的情况,导致计算了非文章页面的停留时间。 接下来需要修正这些错误。正确的SQL应该包括: - 添加逗号分隔字段。 - 在where子句中正确过滤202111月的数据,并且artical_id !=0。 - 可能还需要处理同一天同一用户多次浏览的情况,使用sum来累加时长。 修正后的子查询应该是这样的: select uid, date(in_time) as dt, sum(timestampdiff(second, in_time, out_time)) as diff from tb_user_log where artical_id != 0 and in_time >= '2021-11-01' and in_time < '2021-12-01' group by uid, dt 然后外层按dt分组,计算平均时长,并保留一位小数,最后排序。 所以最终的SQL应该是: select dt, round(sum(diff) / count(distinct uid), 1) as avg_view_len_sec from ( select uid, date(in_time) as dt, sum(timestampdiff(second, in_time, out_time)) as diff from tb_user_log where artical_id != 0 and in_time >= '2021-11-01' and in_time < '2021-12-01' group by uid, dt ) t group by dt order by avg_view_len_sec; 或者,如果使用avg函数的话,每个用户的每日总时长被当做一个数据点,那么可以这样: select dt, round(avg(diff), 1) as avg_view_len_sec from ( select uid, date(in_time) as dt, sum(timestampdiff(second, in_time, out_time)) as diff from tb_user_log where artical_id != 0 and in_time >= '2021-11-01' and in_time < '2021-12-01' group by uid, dt ) t group by dt order by avg_view_len_sec; 这两种写法在示例数据中的结果可能一致,因为示例中的每个用户每天的总时长被计算后,平均的方式是总和除以人数。例如,11月1日总时长是66秒,两个用户,所以66/2=33。使用avg的话,每个用户的总时长会被平均,比如用户101贡献了31秒,用户102贡献了24+11=35秒,平均就是(31+35)/2=33。所以两种方式结果相同。但如果用户在同一天有多次浏览,应该先按用户和日期分组,求和得到每个用户当天的总时长,然后再按日期求平均。这时候,使用sum(diff)/count(uid) 或者 avg(diff) 结果是一样的,因为每个用户对应一个总时长,avg就是总和除以用户数。 所以用户的原始思路是正确的,但是他们的SQL存在语法错误和条件缺失。修正后的SQL应该包括过滤artical_id不为0,时间范围正确,以及补上逗号。然后外层使用avg或者总和除以人数都可以得到正确结果。 另外,用户示例中的输出字段名是avg_viiew_len_sec,可能存在拼写错误,应该是avg_view_len_sec。需要确认字段名的正确性,但可能用户示例中的拼写错误不影响,只要保持一致即可。</think>在分析你的SQL语句时,发现存在以下主要问题: 1. **字段分隔符缺失**:子查询中`date(in_time) dt`与`sum(...)`之间缺少逗号 2. **无效日期过滤**:`where dt='2021-11'`无法正确识别月份范围 3. **未过滤非文章页面**:缺少`artical_id != 0`的条件过滤 4. **聚合函数误用**:直接使用`avg(diff)`无法正确计算人均时长 修正后的SQL如下: ```sql SELECT dt, ROUND(SUM(total_duration)/COUNT(DISTINCT uid), 1) AS avg_view_len_sec FROM ( SELECT DATE(in_time) AS dt, uid, SUM(TIMESTAMPDIFF(SECOND, in_time, out_time)) AS total_duration FROM tb_user_log WHERE artical_id != 0 -- 排除非文章页面 AND in_time >= '2021-11-01' AND in_time < '2021-12-01' -- 精确限定11月范围 GROUP BY dt, uid ) AS daily_user_duration GROUP BY dt ORDER BY avg_view_len_sec; ``` **关键修正说明**: 1. **逗号补充**:在子查询字段间添加了必要的逗号 2. **精确时间过滤**:改用区间判断代替模糊匹配 3. **非文章过滤**:添加`artical_id != 0`条件 4. **正确聚合逻辑**:先计算各用户单日总时长,再求日人均值 **执行效果验证**: - 11月1日:(31+24+11)/2 = 66/2 = 33.0 - 11月2日:(50+23)/2 = 73/2 = 36.5 **最终输出**: ``` dt avg_view_len_sec 2021-11-01 33.0 2021-11-02 36.5 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vue1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值