mysql - 获取前几年同一天的信息

标签 mysql sql

我不确定如果不使用 PHP 是否可行,但我很乐意尝试。

我有一个看起来像这样的数据库(一堆其他的东西,但这就是所有相关的:

Date_Day (范围从 1 到 31,不带尾随 0)

Date_Month (是一月到十二月的范围,不是数字)

Date_Year (是 4 位数格式的年份,例如:2005)

Total (保留 2 位小数)

我知道日期的存储方式很糟糕,但这是我得到的数据库。如果有一个查询我可以使用这些列来创建实际的 DATETIME 列,我会很乐意这样做,我只是不知道该查询是什么样的。

我有一个查询,它返回所有往年这一天的总销售额:

SELECT 
    Date_Year, Date_Month, SUM(Total) 
FROM 
    tablename 
WHERE 
    Date_Year < YEAR(CURDATE()) 
AND 
    Date_Month = MONTHNAME(CURDATE()) 
AND 
    Date_Day = DAY(CURDATE()) 
GROUP BY 
    Date_Year, Date_Month

示例:如果我今天运行此命令,我将获得往年 10 月 4 日的每日总计。问题是,在销售方面,这对于比较增长没有多大帮助。我真正需要的是历年 10 月第一个星期五的每日总计。

这是否可以在不依赖 PHP 的情况下实现?如果是这样,我将非常感谢您的帮助。

我发现这是基于 TSQL 的,但我不知道语法上的差异,也不知道它是否会工作相同。

谢谢。

最佳答案

作为部分答案,您可以结合使用串联、转换和 CHARINDEX 将这三个字段转换为一个日期字段。我知道 t-sql 并且我知道 mysql 有点不同。我有一种感觉,mysql 有一个 CONCATENATE 函数,而不是仅仅使用加号将东西粘在一起。也许其他人可以对此部分发表评论。但如果我在 t-sql 中执行此操作,我会执行类似的操作来获取日期(在美国英语时区):

SELECT CAST(CAST(CHARINDEX(LEFT(Date_Month,3),'XXJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC')/3 as varchar(2))
    + '/' + CAST(Date_Day as varchar(2)) 
    + '/' + CAST(Date_Year as varchar(4)) as date)
FROM tablename 

是的,这不是最快的事情。但这会起作用。然后您可以使用普通的日期时间函数(例如 DATEADD)来获取您要查找的范围。

关于mysql - 获取前几年同一天的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19188844/

相关文章:

php - 根据距离范围计算速率

sql - 经典 ASP 如何引用我用 LEFT 更改的字段

mysql - 为什么我无法 MATCH() AGAINST() FULLTEXT 索引中的列之一?

带有日期时间列的 Mysql 大表

mysql - 无法删除配置单元表

php - 将数据库编码修复为 UTF8

当一个表名没有用单引号引起来时,Mysql会抛出错误

mysql - "undefined method ` 接受 ' for nil:NilClass"

mysql - 将子查询列添加到复杂的选择查询

python - 如何处理 Python 多处理数据库并发,特别是使用 django?