0

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 月の第 1 金曜日の毎日の合計です。

PHPに頼らなくてもこれは可能ですか?もしそうなら、私はあなたの助けにとても感謝しています.

これは TSQL に基づいて見つけましたが、構文の違いや、同じように機能するかどうかさえわかりません。

ありがとうございました。

4

3 に答える 3

0

エレガントではありませんが、次のようなスキーマで 2 番目のテーブルを生成できます。

Date_Day
Date_Month
Date_Year
Day_of_Week
Month_Dow_Counter

行の例はどこにありますか...

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

今日は1月の第2月曜日だからです。次に、Day_of_Weekand Month_Dow_Counter(より適切な名前を考え出す) を使用してこのテーブルをクエリし、日/月/年を取得してから、他のテーブルに結合することができます。

于 2014-01-13T11:08:11.950 に答える
0

You could convert your current columns into a DATE column using STR_TO_DATE with the relevant 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');

I'm not sure there is a particularly clean way to SELECT sales from the first friday of the month, but it can certainly be done. The way I came up with checks what day of the week the first of the month is, and then adds the necessary number of days to reach the following friday - then checks the date of the sales record against that.

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 returns 1 to 7 (Sunday to Saturday). So from the first of the month you can add 6 days, then subtract the DAYOFWEEK to give you the the following Friday - however if the 1st is a Saturday this would return the last day of the previous month so we need to add 7 days in that case.

Example on SQLFiddle (has an alternate version of the above query as well)

于 2014-01-13T10:53:13.333 に答える
0

部分的な回答として、連結、変換、CHARINDEX の組み合わせを使用して、これら 3 つのフィールドを 1 つの日付フィールドに変換できます。私は 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 に答える