2013-10-04 80 views
0

我不確定這甚至可能不使用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,但我不知道語法的差異,或者即使它會工作相同。

謝謝。

+0

如果在上一年的10月的第一個星期五沒有銷售,該怎麼辦?你希望查詢返回什麼? –

+0

http://sqllessons.com/second_tuesday_of_the_month.html – zod

回答

0

作爲部分答案,您可以使用串聯,轉換和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)來獲取您要查找的範圍。

0

則可以將當前列轉換爲使用STR_TO_DATE一個DATE列有關format string

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,以便爲您提供以下星期五 - 但是如果第一天是星期六,這將返回上個月的最後一天,因此我們需要在那種情況。

Example on SQLFiddle(有上面的查詢,以及可替代的形式)

+0

直到最後一刻,我記錄下你的例子使用'CURDATE()'並且在10月份的日期才意識到這個問題已經過去了幾個月...... – OGHaza

0

這不是優雅,但你可以生成具有類似模式的第二個表:

Date_Day 
Date_Month 
Date_Year 
Day_of_Week 
Month_Dow_Counter 

其中一個例子行會...

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

因爲今天是一月的第二個星期一。然後,您可以通過Day_of_WeekMonth_Dow_Counter(提出一個更好的名稱)查詢此表,以恢復日/月/年,然後加入您的其他表格。

相關問題