如何用ttkcalendar日期范围变量查询Oracle 11gR2数据至Pandas DataFrame
日期筛选Oracle数据(基于tkcalendar)
依赖安装
先确保安装所需库:
pip install tkcalendar pandas cx_Oracle
方案1:筛选已导入的Pandas DataFrame
如果已将全量数据导入DataFrame,直接在内存中筛选:
import tkinter as tk from tkinter import ttk from tkcalendar import DateEntry import pandas as pd # 假设你已导入好全量数据到DataFrame,命名为df # df = pd.read_sql("SELECT * FROM your_table", oracle_connection) def filter_data(): # 获取选中的日期 date1 = cal1.get_date() date2 = cal2.get_date() # 确保起始日期不晚于结束日期 if date1 > date2: date1, date2 = date2, date1 # 转换saledate列为datetime类型(若未转换) df['saledate'] = pd.to_datetime(df['saledate']) # 筛选符合日期范围的数据 filtered_df = df[(df['saledate'] >= pd.to_datetime(date1)) & (df['saledate'] <= pd.to_datetime(date2))] # 处理筛选结果,示例:打印前5行+展示到表格 print(filtered_df.head()) display_results(filtered_df) def display_results(df): # 清空表格现有内容 for item in tree.get_children(): tree.delete(item) # 设置表格列 tree["columns"] = list(df.columns) for col in df.columns: tree.heading(col, text=col) tree.column(col, width=100) # 插入数据行 for _, row in df.iterrows(): tree.insert("", tk.END, values=tuple(row)) # 创建主窗口 root = tk.Tk() root.title("日期筛选工具") # 日期选择组件 ttk.Label(root, text="起始日期:").grid(row=0, column=0, padx=5, pady=5) cal1 = DateEntry(root, date_pattern='yyyy-mm-dd') cal1.grid(row=0, column=1, padx=5, pady=5) ttk.Label(root, text="结束日期:").grid(row=1, column=0, padx=5, pady=5) cal2 = DateEntry(root, date_pattern='yyyy-mm-dd') cal2.grid(row=1, column=1, padx=5, pady=5) # 筛选按钮 ttk.Button(root, text="筛选数据", command=filter_data).grid(row=2, column=0, columnspan=2, pady=10) # 结果展示表格 tree = ttk.Treeview(root) tree.grid(row=3, column=0, columnspan=2, padx=5, pady=5, sticky="nsew") # 调整窗口布局自适应 root.grid_rowconfigure(3, weight=1) root.grid_columnconfigure(0, weight=1) root.grid_columnconfigure(1, weight=1) root.mainloop()
方案2:用日期参数执行Oracle查询
若希望直接向Oracle发送带日期条件的查询(避免导入全量数据),可使用以下代码:
import tkinter as tk from tkinter import ttk from tkcalendar import DateEntry import pandas as pd import cx_Oracle # 配置Oracle连接信息(替换为你的实际参数) ORACLE_USER = "your_username" ORACLE_PWD = "your_password" ORACLE_DSN = "your_host:port/service_name" def query_oracle(): # 获取选中的日期并转为字符串格式 date1 = cal1.get_date().strftime('%Y-%m-%d') date2 = cal2.get_date().strftime('%Y-%m-%d') if date1 > date2: date1, date2 = date2, date1 # 构建带绑定参数的查询语句(避免SQL注入) query = """ SELECT * FROM your_table WHERE saledate BETWEEN TO_DATE(:start_date, 'YYYY-MM-DD') AND TO_DATE(:end_date, 'YYYY-MM-DD') """ # 连接Oracle并执行查询 try: with cx_Oracle.connect(ORACLE_USER, ORACLE_PWD, ORACLE_DSN) as conn: df = pd.read_sql(query, conn, params={'start_date': date1, 'end_date': date2}) # 展示查询结果 display_results(df) print(f"查询到{len(df)}条数据") except Exception as e: print(f"查询出错:{str(e)}") def display_results(df): # 同方案1的结果展示逻辑 for item in tree.get_children(): tree.delete(item) tree["columns"] = list(df.columns) for col in df.columns: tree.heading(col, text=col) tree.column(col, width=100) for _, row in df.iterrows(): tree.insert("", tk.END, values=tuple(row)) # 创建主窗口 root = tk.Tk() root.title("Oracle日期查询工具") # 日期选择组件 ttk.Label(root, text="起始日期:").grid(row=0, column=0, padx=5, pady=5) cal1 = DateEntry(root, date_pattern='yyyy-mm-dd') cal1.grid(row=0, column=1, padx=5, pady=5) ttk.Label(root, text="结束日期:").grid(row=1, column=0, padx=5, pady=5) cal2 = DateEntry(root, date_pattern='yyyy-mm-dd') cal2.grid(row=1, column=1, padx=5, pady=5) # 查询按钮 ttk.Button(root, text="执行查询", command=query_oracle).grid(row=2, column=0, columnspan=2, pady=10) # 结果展示表格 tree = ttk.Treeview(root) tree.grid(row=3, column=0, columnspan=2, padx=5, pady=5, sticky="nsew") # 布局调整 root.grid_rowconfigure(3, weight=1) root.grid_columnconfigure(0, weight=1) root.grid_columnconfigure(1, weight=1) root.mainloop()
关键注意事项
- 确保DataFrame中的
saledate列是datetime类型,若不是,用pd.to_datetime()转换。 - Oracle查询时必须使用绑定参数(
:start_date),禁止直接拼接日期字符串,避免SQL注入风险。 DateEntry的日期格式可通过date_pattern参数调整,需匹配Oracle的日期解析格式。
内容的提问来源于stack exchange,提问作者badar Qureshi
相关产品推荐
相关产品推荐

