首页 > 数据库 >从数据库查询数据并导出到excel

从数据库查询数据并导出到excel

时间:2024-03-21 16:25:52浏览次数:28  
标签:estStarted WHEN 数据库 excel 导出 deadline endday zt startday

import pymysql
import datetime
import xlwt
import os
import pandas as pd

def export_excel(output_dir):
    current_datetime = datetime.datetime.now()
    # 将日期时间格式化为字符串,例如:2023-10-23_14-30-15
    formatted_datetime = current_datetime.strftime('%Y-%m')
    formatted_datetime1 = current_datetime.strftime('%Y-%m-%d')
    # 构造文件名,包含表名和格式化后的日期时间
    file_name = f'{formatted_datetime}月.xls'
    # 使用f-string来格式化工作表名称
    sheet_name1 = f'{formatted_datetime1}'
    # 构造完整的文件路径
    file_path = os.path.join(output_dir, file_name)
    # 连接MySQL数据库
    conn = pymysql.connect(host='***', user='***', password='***', db='***')
    # 创建一个Cursor对象,用于执行SQL命令
    cur = conn.cursor()
    today = datetime.date.today()
    weekday = today.weekday()
    startday = today - datetime.timedelta(days=weekday)
    endday = startday + datetime.timedelta(days=(6 - weekday) if weekday != 6 else 0)
    startday_str = startday.strftime('%Y-%m-%d')
    endday_str = endday.strftime('%Y-%m-%d')

    print(f"本周起始日期: {startday_str}")
    print(f"本周结束日期: {endday_str}")
    person = 5
    sql_query =f"""  
    SELECT          
        CASE dept          
            WHEN 119 THEN '规划南方大区'          
            WHEN 148 THEN '调度主网'          
            WHEN 149 THEN '调度配网'          
            WHEN 150 THEN '调度发电'          
            WHEN 151 THEN '调度校核'          
            WHEN 152 THEN '调度数字化'          
            WHEN 32 THEN '规划产品研发'          
            WHEN 92 THEN '大数据产品研发'          
            WHEN 102 THEN '新电-平台开发部'          
            WHEN 76 THEN '新电-产品交付部'          
            WHEN 62 THEN '新电-交易'          
            WHEN 75 THEN '数字设备研发二部'          
            WHEN 26 THEN '数字设备研发一部'          
            WHEN 19 THEN '研发中心平台巴'         
        END AS 部门,        
        dh.计划消耗总工时,      
        dh.总人数,      
        '{person}' * dh.总人数 * 8 AS 标准工时,
        round((dh.计划消耗总工时 / ('{person}' * dh.总人数 * 8)) * 100, 2) AS 研发计划负载率, 
        LEAST(round((dh.计划消耗总工时 / ('{person}' * dh.总人数 * 8)) * 100, 2), 100) AS 研发计算负载率,  -- 确保负载率不超过100    
        GREATEST(0, (1 - (100 - LEAST(round((dh.计划消耗总工时 / ('{person}' * dh.总人数 * 8)) * 100, 2), 100)) / (100 - 95)) * 2.5) AS 得分 -- 确保得分不低于0  
    FROM (      
        SELECT          
            dept,      
        round(
        SUM(  
            CASE  
              WHEN zt.realStarted = '0000-00-00 00:00:00' THEN  
                CASE  
                  WHEN zt.deadline BETWEEN '{startday}'  AND '{endday}' AND zt.estStarted < '{startday}'  THEN  
                    (zt.left / (DATEDIFF(zt.deadline, NOW()) + 1)) * (DATEDIFF(zt.deadline, '{startday}' ) + 1)  -- 任务未开始,预计开始日期在计划外,截止日期在计划内
                  WHEN zt.estStarted BETWEEN '{startday}'  AND '{endday}' AND zt.deadline > '{endday}' THEN  
                    (zt.left / (DATEDIFF(zt.deadline, zt.estStarted) + 1)) * (DATEDIFF('{endday}', zt.estStarted) + 1)  -- 任务未开始,预计开始日期在计划内,截止日期在计划外
                  WHEN zt.estStarted < '{startday}'  AND zt.deadline > '{endday}' THEN  
                    (zt.left / (DATEDIFF(zt.deadline, NOW()) + 1)) * (DATEDIFF('{endday}', '{startday}' ) + 1)  -- 任务未开始,预计开始日期,截止日期均在计划外
                  WHEN zt.estStarted > '{startday}'  AND zt.deadline < '{endday}' THEN  
                    zt.left  -- 任务未开始,预计开始日期,截止日期均在计划内
                  ELSE 0  
                END  
              WHEN zt.realStarted != '0000-00-00 00:00:00' THEN  -- 任务已开始
                CASE  
                  WHEN zt.deadline BETWEEN '{startday}'  AND '{endday}' AND zt.estStarted < '{startday}'  THEN  
                    (zt.left / (DATEDIFF(zt.deadline, NOW()) + 1)) * (DATEDIFF(zt.deadline, '{startday}' ) + 1)  
                  WHEN zt.estStarted BETWEEN '{startday}'  AND '{endday}' AND zt.deadline > '{endday}' THEN  
                    (zt.left / (DATEDIFF(zt.deadline, zt.estStarted) + 1)) * (DATEDIFF('{endday}', zt.estStarted) + 1)  
                  WHEN zt.estStarted < '{startday}'  AND zt.deadline > '{endday}' THEN  
                    (zt.left / (DATEDIFF(zt.deadline, NOW()) + 1)) * (DATEDIFF('{endday}', '{startday}' ) + 1)  
                  WHEN zt.estStarted > '{startday}'  AND zt.deadline < '{endday}' THEN  
                    zt.left  
                  ELSE 0  
                END  
              ELSE 0  
            end  
          ),2) AS 计划消耗总工时,  
            count(DISTINCT zu.id) AS 总人数  
        FROM          
            zt_user zu          
           inner JOIN zt_task zt ON zu.account IN (zt.finishedBy, zt.assignedTo) and zt.parent != -1
                AND (zt.deadline BETWEEN '{startday}'  AND '{endday}' OR zt.estStarted BETWEEN '{startday}'  AND '{endday}')          
                AND zt.deleted != '1'           
        WHERE          
            zu.dept IN (148, 149, 150, 151, 152, 119, 32, 62, 92, 102, 75, 26, 76, 19)          
            AND zu.deleted = '0'          
            AND zu.realname NOT IN('仇佳丽','郭鸿志','谭晓龙','郑朋','韩世飞','陈伟','付龙明','于瑞丰','谭小龙','张文斌','贺成利','宁杰','张琪','杨海燕','朱博','赵少飞')
        GROUP BY          
            zu.dept      
    ) dh      
    ORDER BY       
        部门;
    """

    # 执行SQL命令
    cur.execute(sql_query)
    fileds=[filed[0] for filed in cur.description]#所有字段
    all_data=cur.fetchall()#所有数据值,数组形式存放
    book=xlwt.Workbook()
    sheet=book.add_sheet(sheet_name1)
    for col,filed in enumerate(fileds):
        sheet.write(0, col, filed)
    row=1
    for data in all_data:
        for index, datacol in enumerate(data):
            sheet.write(row, index, datacol)
        row = row + 1
    book.save(file_path)  # 使用完整的文件路径来保存工作簿

    # 设置输出目录
output_dir = r'C:\Users\Administrator\Desktop\2024年工作文件夹\研发绩效考核\负载得分'

    # 导出Excel,使用带日期时间的文件名
export_excel(output_dir)

  

标签:estStarted,WHEN,数据库,excel,导出,deadline,endday,zt,startday
From: https://www.cnblogs.com/ruijie/p/18087643

相关文章

  • 【数据库】SQL如何添加数据
    在SQL中,您可以使用INSERTINTO语句来添加数据到数据库表中。以下是一些基本的示例和解释:1.插入完整行数据:如果您想为表中的每一列都插入数据,那么可以不必指定列名。但是,您需要为每一列都提供数据,并且数据的顺序必须与表中的列顺序相匹配。INSERTINTO表名(列1,列2,列3......
  • 二 Superset通过API创建数据库连接和数据集
    Superset通过API创建数据库连接和数据集1登录Post登录http://localhost:8088/api/v1/security/loginBodyraw(json){"password":"123456","provider":"db","refresh":true,"username":"admi......
  • OLAP数据库选型指南:Doris与ClickHouse的深入对比与分析
    码到三十五:个人主页心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得!在当今数据驱动的时代,数据的存储、处理和分析变得尤为重要。为了满足这一需求,市场上涌现出了许多优秀的数据处理和分析工具。其中,Doris和ClickHouse是两个备受关注的开源项目。本......
  • vSAN HCL数据库版本及版本目录告警处理
    原文链接:https://blog.csdn.net/andycnm/article/details/129661646vSANHCL数据库版本更新https://partnerweb.vmware.com/service/vsan/all.json右键单击,另存为all.json,如果无法保存文件,则必须复制整个内容并创建扩展名为“*.json".的新文件。将文件上传更新   vSA......
  • revit二开中文字注释族导出cad后出现翻转的问题
    在revit中存在该一个导出cad的BUG即:revit中的文字注释族中的文字是可以有“可读”选项的,而CAD中是没有该选项的,所以会出现revit导出cad后文字翻转的情况 解决方案跟revit导出cad的机制有关,revit针对自定义族导出到cad中是这样一个机制:同一个形状只导出一个块。解决方案:将文......
  • 【Mysql数据库基础01】去重、连接字符、模糊查询、通配符、检索表的结构信息
    去重、连接字符、模糊查询、通配符、检索表的结构信息1去重distinct2连接字符函数concat(str1,str2,...)3模糊查询3.1like包含3.2通配符3.3betweenand3.4in3.5isnull4安全等于<=>5检索表的结构信息desc6课后练习1去重distinct使用DISTINCT关......
  • linq链接数据库SQL封装类
    linq链接数据库SQL封装类首先,需要定义一个LINQtoSQL的上下文类,这个类是从DataContext继承而来,并且包含了映射到数据库表的实体类。[Database(Name="MyDatabase")]publicclassMyDataContext:DataContext{publicTable<User>Users;publicMyDataContext(stri......
  • 二十、数据库设计
    一、数据库设计的重要性在系统研发中,数据库作为数据的保存介质,那么数据库如何保存业务数据。这就需要开发者来设计了。当数据库比较复杂(如数据量大,表较多,业务关系复杂)时:1、良好的数据库设计可以:节省数据的存储空间能够保证数据的完整性方便进行数据库应用系统的开发2、糟糕......
  • WPS WORD EXCEL 不合并显示
    WPSWORDEXCEL不合并显示 版本:WPS12,下载时间约是2023年。 1.在开始菜单里找到WPSOFFICE-配置工具2.点击“高级(A)”。3.在“其他选项”选项卡中,点击“切换到旧版的多组件模式”。4.选择“多组件模式”,然后确定。11......
  • python轻量数据库TinyDB使用
    安装pipinstalltinydb特性1.轻量易用2.JSON数据存储,使用json格式存储数据,类似mongodb数据库。3.支持查询和过滤4.支持事务5.可插件拓展示例fromtinydbimportTinyDB,Query​#创建数据库db=TinyDB('my_db.json') #会在本地创建一个"my_db.json"文件作为数据......