0

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

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

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

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

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

Total(带小数点后两位的数字)

我知道日期的存储方式很糟糕,但这是给我的数据库。如果有一个查询我可以使用这些列来创建一个实际的 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 的,但我不知道语法上的差异,甚至不知道它是否会起作用。

谢谢你。

4

3 回答 3

0

这并不优雅,但您可以生成第二个表,其架构如下:

Date_Day
Date_Month
Date_Year
Day_of_Week
Month_Dow_Counter

示例行在哪里...

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

因为今天是一月的第二个星期一。Day_of_Week然后,您可以通过and查询该表Month_Dow_Counter(想出一个更好的名称)以取回日/月/年,然后加入您的另一个表。

于 2014-01-13T11:08:11.950 回答
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 这样的普通日期时间函数来获取你正在寻找的范围。

于 2013-10-04T20:51:48.647 回答
0

您可以使用相关格式字符串将当前列转换为DATE列:STR_TO_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以得到下一个星期五 - 但是如果第 1 天是星期六,这将返回上个月的最后一天,因此我们需要在其中添加 7 天案子。

SQLFiddle 上的示例(也有上述查询的替代版本)

于 2014-01-13T10:53:13.333 回答