需要帮助过滤表中特定年份的数据,但日期定义为 varchar如何编写我的连接查询?

问题描述

请在我的代码下方找到。我正在使用 2012 年的连接和过滤数据加入 3 个表,以查看今年的总销售额。请不要将销售表中的 sales_date 列定义为 varchar(格式 = mm/dd/yyyy)

SELECT country.name,parts.name,SUM(parts.price * sales.quantity) AS total_sales
FROM sales JOIN country ON country.id=sales.country_id
JOIN parts ON parts.id=sales.model_id
WHERE sales.sales_date between '1/1/2012' and '12/31/2012'
GROUP BY country.name,parts.name
ORDER BY total_sales asc;

以上查询为我提供了所有结果,而不是针对特定年份进行过滤。如果您有任何问题,请告诉我

解决方法

我的建议是修复数据!日期应使用本机日期/时间格式存储。并且可以(通常)修复损坏的数据。

如果这是不可能的,那么您可以使用字符串操作来获取年份。在这种情况下,like 执行您想要的操作:

where sales.sales_date like '%2012'

请勿对 LIKE/date 数据使用 datetime。它是为字符串而设计的,在这里你是在字符串上使用它。

要修复您的数据,您可以执行以下操作。

首先,将日期放入正确的 YYYY-MM-DD 格式:

update sales
    set sales_date = str_to_date(sales.date,'%m/%d/%Y');

然后修改列:

alter table sales modify column sales_date date;