获取前几年同一天的信息

时间:2013-10-04 19:01:20

标签: mysql sql

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

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

Date_Day(范围从1到31,没有尾随0)

Date_Month(是1月到12月的范围,不是数字)

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的,但我不知道语法上的差异,甚至它是否会起作用。

谢谢。

3 个答案:

答案 0 :(得分:0)

作为部分答案,您可以使用连接,转换和CHARINDEX的组合将这三个字段转换为一个日期字段。我知道t-sql,我知道mysql有点不同。我有一种感觉,mysql有一个CONCATENATE函数,而不是只是使用加号将事物粘在一起。也许其他人可以评论这一部分。但是,如果我在t-sql中这样做,我会做这样的事情来获取日期(在US-Eng时区):

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这样的普通日期时间函数来获得你正在寻找的范围。

答案 1 :(得分:0)

您可以使用STR_TO_DATE使用相关的format string将当前列转换为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天。

Example on SQLFiddle(还有以上查询的备用版本)

答案 2 :(得分:0)

这不是很优雅,但您可以使用以下架构生成第二个表:

Date_Day
Date_Month
Date_Year
Day_of_Week
Month_Dow_Counter

示例行将是......

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

因为今天是1月的第2个星期一。然后,您可以通过Day_of_WeekMonth_Dow_Counter查询此表(提供更好的名称)以获取日/月/年,然后加入您的其他表。

相关问题