【问题标题】:Retrieving Data from database on quaterly basis condition But it should be based on current year data only按季度从数据库中检索数据但它应该仅基于当年数据
【发布时间】:2013-06-22 09:55:46
【问题描述】:

我试过这段代码:

它的工作也很好,但问题是,如果当前月份是 2 月并触发此查询,那么它会考虑从现在起过去 3 个月,因此从过去一年开始,即 2012 年 11 月或 12 月说我只想要当年的数据,如果现在是 2 月,我触发了这个查询,那么它应该只显示 1 月和 2 月的记录。

   SELECT CROEmailId, 
(
SELECT COUNT(LeadId) 
FROM LeadStatus 
WHERE DATE(`LeadTime`)> DATE_SUB(now(), 
INTERVAL 3 MONTH
) 
AND Generated=1 and AssignedTo=a.CROEmailId) 
AS 'NEW LEAD',(
SELECT COUNT(LeadId) 
FROM LeadHistory 
WHERE DATE(UpdatedAt)> DATE_SUB(now(), 
INTERVAL 3 MONTH
) AND AssignedTo=a.CROEmailId) 
AS 'Lead Updated',
(
SELECT SUM(TotalEmails)
FROM MailJobs 
WHERE DATE(CompletedAt)> DATE_SUB(now(), 
INTERVAL 3 MONTH
) 
AND MailFrom=a.CROEmailId) 
AS 'Email Uploaded',
(
SELECT SUM(TotalSent) 
FROM MailJobs 
WHERE DATE(CompletedAt)> DATE_SUB(now(), 
INTERVAL 3 MONTH) 
AND MailFrom=a.CROEmailId
) 
AS 'Email Sent',
(
SELECT SUM(NetTotal) 
FROM Invoice 
WHERE Status='PAID' 
AND DATE(CreatedAt)> DATE_SUB(now(), INTERVAL 3 MONTH) 
AND CROEmailId=a.CROEmailId) 
AS 'Payment Today' FROM CustomersManager a;

【问题讨论】:

    标签: mysql


    【解决方案1】:

    尝试改变

    DATE_SUB(now(), INTERVAL 3 MONTH)
    

    IF(MONTH(CURDATE()) < 4, DATE_FORMAT(CURDATE(), '%Y-01-01'), CURDATE() - INTERVAL 3 MONTH)
    

    在所有子查询中。

    SELECT CROEmailId, 
           (SELECT COUNT(LeadId) 
              FROM LeadStatus 
             WHERE DATE(`LeadTime`)> IF(MONTH(CURDATE()) < 4, DATE_FORMAT(CURDATE(), '%Y-01-01'), CURDATE() - INTERVAL 3 MONTH) 
               AND Generated=1 
               AND AssignedTo=a.CROEmailId) AS 'NEW LEAD',
           (SELECT COUNT(LeadId) 
              FROM LeadHistory 
             WHERE DATE(UpdatedAt)> IF(MONTH(CURDATE()) < 4, DATE_FORMAT(CURDATE(), '%Y-01-01'), CURDATE() - INTERVAL 3 MONTH) 
               AND AssignedTo=a.CROEmailId) AS 'Lead Updated',
           (SELECT SUM(TotalEmails)
              from MailJobs 
             WHERE DATE(CompletedAt)> IF(MONTH(CURDATE()) < 4, DATE_FORMAT(CURDATE(), '%Y-01-01'), CURDATE() - INTERVAL 3 MONTH) 
               AND MailFrom=a.CROEmailId) AS 'Email Uploaded',
           (SELECT SUM(TotalSent) 
              FROM MailJobs 
             WHERE DATE(CompletedAt)> IF(MONTH(CURDATE()) < 4, DATE_FORMAT(CURDATE(), '%Y-01-01'), CURDATE() - INTERVAL 3 MONTH) 
               AND MailFrom=a.CROEmailId) AS 'Email Sent',
           (SELECT SUM(NetTotal) 
              FROM Invoice 
             WHERE Status='PAID' 
               AND DATE(CreatedAt)> IF(MONTH(CURDATE()) < 4, DATE_FORMAT(CURDATE(), '%Y-01-01'), CURDATE() - INTERVAL 3 MONTH) 
               AND CROEmailId=a.CROEmailId) AS 'Payment Today' 
      FROM CustomersManager a;
    

    【讨论】:

    • 非常感谢这个解决方案实际上我正在以某种方式思考只是非常感谢......但是先生,哪一个会更优化??
    【解决方案2】:

    在您的查询中使用它来按年份查找记录过滤器

     YEAR( '20013-12-12' )
    

    例子,

    SELECT * FROM TABLE WHERE YEAR(DATE_FIELD) = 2013
    

    【讨论】:

    • Thnx 很多,我多么愚蠢……我怎么没想到这一点……非常感谢……这符合我的标准……
    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2018-10-31
    • 2015-12-22
    相关资源
    最近更新 更多