有没有不适用date_sub的方法
时间: 2024-09-27 12:02:45 浏览: 30
当然可以,如果你不想使用`DATE_SUB()`函数来计算过去的一周,还有其他方式。在MySQL中,你可以直接比较日期和当前日期来达到同样的效果。例如,如果你想找出过去七天的数据,可以用这样的条件:
```sql
WHERE created_date >= CURDATE() - INTERVAL 7 DAY
```
这行代码的意思是从今天开始往前数7天,也就是过去的一周。这样就可以避免使用`DATE_SUB()`函数。
然而,这种方法更直接,但它可能会比`DATE_SUB()`稍微慢一些,因为它涉及到实时计算而不是预处理时间间隔。对于频繁查询的情况,`DATE_SUB()`通常会更快,因为它只需要一次计算。
另外,如果你的日期字段是以某种特定格式存储的字符串,并且你需要将其转换为日期才能进行比较,那么可能需要额外的转换步骤。例如,如果日期是"YYYY-MM-DD"格式的字符串:
```sql
WHERE STR_TO_DATE(created_date, '%Y-%m-%d') >= CURDATE() - INTERVAL 7 DAY
```
这将会把字符串格式的日期转换成日期格式再进行比较。
相关问题
select avg(if(q2.device_id is not null,1,0)) as avg_ret from (select distinct device_id,date from question_practice_detail) q1 left join (select distinct device_id,date_sub(date,interval 1 day) as date from question_practice_detail) q2 on q1.device_id = q2.device_id and q1.date = q2.date; 优化这段代码
这段代码主要是计算某个时间段内设备的平均留存率。为了优化这段代码,可以考虑以下几个方面:
1. 对子查询进行优化:将子查询中的DISTINCT操作改为GROUP BY操作,同时添加索引以加速查询速度。
2. 对JOIN操作进行优化:使用INNER JOIN代替LEFT JOIN,因为LEFT JOIN会对右表进行全表扫描,而INNER JOIN只会扫描符合条件的记录。
3. 避免使用函数:IF函数会降低查询速度,可以使用CASE WHEN语句代替。
优化后的代码如下所示:
```
SELECT AVG(CASE WHEN q2.device_id IS NOT NULL THEN 1 ELSE 0 END) AS avg_ret
FROM (
SELECT device_id, DATE(date) AS date
FROM question_practice_detail
GROUP BY device_id, DATE(date)
) q1
INNER JOIN (
SELECT DISTINCT device_id, DATE(date - INTERVAL 1 DAY) AS date
FROM question_practice_detail
) q2
ON q1.device_id = q2.device_id AND q1.date = q2.date;
```
需要注意的是,以上优化方案并不一定适用于所有情况,具体还需要根据实际情况进行评估。
def show_query1_result(self): # 查询数据 db = pymysql.connect(host='39.99.214.172', user='root', password='Solotion.123', db='jj_tset') cursor = db.cursor() db_sql = """ SELECT *,salary + weight_reward total_salary from ( SELECT a.user_id,user_name,get_time,get_kg,efficiency,CONCAT(ROUND(ROUND(yield_rate,4) * 100,2),'%') yield_rate,ROUND(get_kg * 2 * price,1) salary,CASE WHEN yield_rate > 0.64 and get_kg < 40 THEN kg1_price WHEN yield_rate > 0.64 and get_kg < 50 THEN kg2_price WHEN yield_rate > 0.64 and get_kg >= 50 THEN kg3_price WHEN yield_rate < 0.64 THEN 0 END as weight_reward FROM (SELECT user_id, DATE_FORMAT(get_time,'%Y-%m-%d') get_time, SUM(get_kg) get_kg,round(SUM(get_kg)/(SUM(duration_time)/3600),2) efficiency,AVG(yield_rate) yield_rate FROM em_salary WHERE DATE_FORMAT(get_time,'%Y-%m-%d') = DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 0 DAY),'%Y-%m-%d') and recycle_kg IS NOT NULL GROUP BY user_id, DATE_FORMAT(get_time,'%Y-%m-%d')) a LEFT JOIN (SELECT user_id,`name` as user_name,price,kg1_price,kg2_price,kg3_price,yield_price FROM `employee_table` CROSS JOIN price_data ) d on a.user_id = d.user_id ) T """ cursor.execute(db_sql) result = cursor.fetchall() db.close() if len(result) == 0: QMessageBox.information(self, "提示", "今日无员工工资记录") return # 清空表格 self.query1_window.table_widget.setRowCount(0) self.query1_window.table_widget.setColumnCount(len(result[0])) self.query1_window.table_widget.setHorizontalHeaderLabels( ["员工ID", "员工姓名", "日期", "领取鸡爪重量(KG)", "效率(每小时KG)", "出成率", "基础工资", "重量奖励", "当日总工资"]) # 添加数据到表格 for row_num, row_data in enumerate(result): self.query1_window.table_widget.insertRow(row_num) for col_num, col_data in enumerate(row_data): self.query1_window.table_widget.setItem(row_num, col_num, QTableWidgetItem(str(col_data))) # 显示窗口 self.query1_window.show()怎么让数据展示页面最下面显示汇总信息
你可以在查询数据之后,在代码中计算出汇总信息,并将其添加到表格的最后一行。具体来说,你可以创建一个包含汇总信息的列表,并将其添加到表格的最后一行。例如,假设你想汇总当日总工资,你可以在代码中添加以下行:
```
# 计算汇总信息
total_salary = sum([row[8] for row in result])
summary_row = ["", "", "汇总", "", "", "", "", "", total_salary]
# 添加汇总信息到表格
self.query1_window.table_widget.insertRow(len(result))
for col_num, col_data in enumerate(summary_row):
self.query1_window.table_widget.setItem(len(result), col_num, QTableWidgetItem(str(col_data)))
```
这将在表格的最后一行添加一个汇总信息,其中第3列将显示“汇总”,第9列将显示当日总工资的总和。请注意,这样的计算仅适用于当日的工资记录。如果你希望计算其他类型的汇总信息,请相应地修改上面的代码。
阅读全文