此问题在此处已有答案:
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的,但我不知道语法上的差异,甚至不知道它是否会工作相同。
3条答案
按热度按时间zphenhs41#
作为部分答案,您可以使用串联,转换,和CHARINDEX将这三个字段转换为一个日期字段。我知道t-sql,我知道mysql有点不同。我有一种感觉,mysql有一个CONCATENATE函数,而不仅仅是使用加号将东西粘在一起。也许其他人可以评论这一部分。但如果我在t中这样做-sql我会做这样的事情来获取日期(在美国-英语时区):
字符串
是的,这不会是最快的事情。但它会工作。然后你可以使用正常的日期时间函数,如DATEADD,以获得您正在寻找的范围。
a1o7rhls2#
您可以使用
STR_TO_DATE
和相关格式字符串将当前列转换为DATE
列:字符串
我不确定是否有一种特别干净的方法可以从每月的第一个星期五开始计算
SELECT
的销售额,但它肯定可以做到。我想出的方法是检查每月的第一个星期是星期几,然后添加必要的天数以达到下一个星期五-然后检查销售记录的日期。型
DAYOFWEEK
返回1到7(星期日到星期六)。因此,您可以从每月的第一天添加6天,然后减去DAYOFWEEK
以给予您下一个星期五-但是,如果第一天是星期六,则返回前一个月的最后一天,因此我们需要在这种情况下添加7天。SQLFiddle上的示例(也有上述查询的替代版本)
pvabu6sv3#
这并不优雅,但您可以使用以下模式生成第二个表:
字符串
其中示例行是...
型
因为今天是一月的第二个星期一。然后,你可以通过
Day_of_Week
和Month_Dow_Counter
(想出一个更好的名字)查询这个表,以获取日/月/年,然后连接到你的另一个表。