109

Oracle のテーブル サーバーには、組み込み関数TRUNC(timestamp,'DY'). この関数は、タイムスタンプを前の日曜日の午前 0 時に変換します。MySQLでこれを行う最良の方法は何ですか?

オラクルはまたTRUNC(timestamp,'MM')、タイムスタンプが発生した月の最初の日の午前 0 時にタイムスタンプを変換することも提案しています。MySQL では、これは簡単です。

TIMESTAMP(DATE_FORMAT(timestamp, '%Y-%m-01'))

しかし、このDATE_FORMATトリックは数週間は機能しません。私はWEEK(timestamp)関数を認識していますが、年内の週番号は本当に必要ありません。これは複数年にわたる作業用です。

4

9 に答える 9

141

YEAR(timestamp)と の両方を使用できWEEK(timestamp)、これらの式の両方を句SELECTGROUP BY句で使用できます。

派手すぎず機能的…

そしてもちろん、これら 2 つの日付部分を 1 つの式に結合することもできます。

SELECT CONCAT(YEAR(timestamp), '/', WEEK(timestamp)), etc...
FROM ...
WHERE ..
GROUP BY CONCAT(YEAR(timestamp), '/', WEEK(timestamp))

編集:マーティンが指摘するように、関数を使用することもできますがYEARWEEK(mysqldatefield)、その出力は上記の長い式ほど目に優しくありません。


編集 2 [3 1/2 年後!]:
YEARWEEK(mysqldatefield)オプションの 2 番目の引数 ( mode) を 0 または 2 に設定すると、完全な週 (つまり、1 月 1 日をまたがる週を含む) で集計する最良の方法です。何が望まれるか。この回答で最初に提案されたアプローチには、そのような「またがる」YEAR() / WEEK()週の集計データを2 つに分割する効果があります。1 つは前の年、もう 1 つは新年です。 会計などでは、毎年 1 週間ずつの部分的な週を最大 2 週間設けるという代償を払って、毎年きれいにカットすることが望まれます。
YEAR() / WEEK()

于 2009-11-14T23:47:57.807 に答える
51

わかりました... 少し面倒ですが、ここにあります。

FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))

また、ビジネス ルールで週の開始日が月曜日である場合は、 を に変更-1-2ます。


編集

何年も経ち、ようやくこれを書くことができました。 https://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/

于 2009-11-15T00:51:16.837 に答える
41

上記の受け入れられた回答は、時系列ではなくアルファベット順に週を並べたため、私にはうまくいきませんでした。

2012/1
2012/10
2012/11
...
2012/19
2012/2

週ごとにカウントしてグループ化する私のソリューションは次のとおりです。

SELECT CONCAT(YEAR(date), '/', WEEK(date)) AS week_name, 
       YEAR(date), WEEK(date), COUNT(*)
FROM column_name
GROUP BY week_name
ORDER BY YEAR(DATE) ASC, WEEK(date) ASC

生成:

YEAR/WEEK   YEAR   WEEK   COUNT
2011/51     2011    51      15
2011/52     2011    52      14
2012/1      2012    1       20
2012/2      2012    2       14
2012/3      2012    3       19
2012/4      2012    4       19
于 2012-08-01T12:46:21.853 に答える
26

YEARWEEK()関数を使用して、連結された年と週の番号 (200945) を取得できます。私があなたの目標を正しく理解していれば、複数年のデータをグループ化できるはずです。

週の始まりの実際のタイムスタンプが必要な場合は、あまり良くありません:

DATE_SUB( field, INTERVAL DAYOFWEEK( field ) - 1 DAY )

毎月の並べ替えの場合、LAST_DAY()関数を検討することができます。並べ替えは月の最終日で行われますが、それは月の初日で並べ替えることと同等である必要があります。

于 2009-11-14T23:58:18.650 に答える
4

これを select に追加するだけです:

DATE_FORMAT($yourDate, \'%X %V\') as week

group_by(week);
于 2010-08-31T08:58:56.203 に答える
3

「週の終わり」の日付が必要な場合は、これも機能します。これにより、各週のレコード数がカウントされます。例: 2010 年 1 月 2 日から 2010 年 1 月 8 日までの間に 3 つの作業指示書が作成され、2010 年 1 月 9 日から 2010 年 1 月 16 日までの間に 5 つの作業指示書が作成された場合、次のように返されます。

3 2010年 1 月 8
日 5 2010 年 1 月 16 日

日時フィールドを切り捨てるために、追加の DATE() 関数を使用する必要がありました。

SELECT COUNT(*), DATE_ADD( DATE(wo.date_created), INTERVAL (7 - DAYOFWEEK( wo.date_created )) DAY) week_ending
FROM work_order wo
GROUP BY week_ending;
于 2011-01-18T02:28:07.323 に答える