You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:38:27