mysql 获取前几年同一天的信息[副本]

scyqe7ek  于 2024-01-05  发布在  Mysql
关注(0)|答案(3)|浏览(122)

此问题在此处已有答案

last friday of the month in MySQL(2个答案)
9年前关闭。
我不确定如果不使用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的,但我不知道语法上的差异,甚至不知道它是否会工作相同。

zphenhs4

zphenhs41#

作为部分答案,您可以使用串联,转换,和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,以获得您正在寻找的范围。

a1o7rhls

a1o7rhls2#

您可以使用STR_TO_DATE和相关格式字符串将当前列转换为DATE列:

ALTER TABLE Sales ADD Date_Type DATE;

UPDATE Sales
SET Date_Type = STR_TO_DATE(CONCAT(Date_Year,Date_Month,Date_Day), '%Y%M%e');

字符串
我不确定是否有一种特别干净的方法可以从每月的第一个星期五开始计算SELECT的销售额,但它肯定可以做到。我想出的方法是检查每月的第一个星期是星期几,然后添加必要的天数以达到下一个星期五-然后检查销售记录的日期。

SET @Month = MONTH(CURDATE());
SET @MMDD  = CONCAT('-',@Month,'-01');

SELECT * 
FROM Sales
WHERE Date_Type = 
        DATE_ADD(CONCAT(YEAR(Date_Type),@MMDD), INTERVAL
            CASE WHEN DAYOFWEEK(CONCAT(YEAR(Date_Type),@MMDD)) = 7 
                 THEN 7 ELSE 0 
            END 
            + 6 - DAYOFWEEK(CONCAT(YEAR(Date_Type),@MMDD)) DAY);


DAYOFWEEK返回1到7(星期日到星期六)。因此,您可以从每月的第一天添加6天,然后减去DAYOFWEEK以给予您下一个星期五-但是,如果第一天是星期六,则返回前一个月的最后一天,因此我们需要在这种情况下添加7天。
SQLFiddle上的示例(也有上述查询的替代版本)

pvabu6sv

pvabu6sv3#

这并不优雅,但您可以使用以下模式生成第二个表:

Date_Day
Date_Month
Date_Year
Day_of_Week
Month_Dow_Counter

字符串
其中示例行是...

(13, 1, 2014, 'Monday', 2)


因为今天是一月的第二个星期一。然后,你可以通过Day_of_WeekMonth_Dow_Counter(想出一个更好的名字)查询这个表,以获取日/月/年,然后连接到你的另一个表。

相关问题