0

特定の週に続く週の数を計算する必要があります。これは、年内のほとんどの週では些細なことですが、年末/年始ではそうではありません。たとえば、2013 年の第 52 週の次の週を知る必要があるとします。

私は defaul_week_format 3 を使用したいと思います。つまり、a) 週は (日曜日ではなく) 月曜日から始まります。b) 1 年内の番号付けは (0 ではなく) 1 から始まります。c) 週番号 1 は、それ以上の週数を持つ最初の週です。今年はあと3日。

たとえば、2014 年 36 週後の週を計算するための私のアプローチは次のとおりです。

SELECT WEEK(DATE_ADD(STR_TO_DATE('W36 2014 Tuesday', 'W%V %X %W'), INTERVAL 1 WEEK))

この例では、第 36 週の火曜日の日付を計算し、1 週間追加して、この日の週を計算します。これは機能しますが、1 週間追加しなくても、次のような奇妙な動作が発生します。

default_week_format 0 で機能します。

SET @@local.default_week_format=0;
SELECT STR_TO_DATE('W36 2014 Tuesday', 'W%V %X %W');
-> Tuesday of week 36 is 2014-09-09
SELECT week('2014-09-09');
-> 2014-09-09 is in week 36

これまでのところ、とても良いです: 36 週目の火曜日は 36 週目です。

しかし、この簡単な実験は default_week_format 3 ではうまくいきません:

SET @@local.default_week_format=3;
SELECT STR_TO_DATE('W36 2014 Tuesday', 'W%V %X %W');
-> Tuesday of week 36 is 2014-09-09
-> This is wrong, because numbering should start with 1 (instead of 0 now)!
-> Tuesday of week 36 should be 2014-09-02
SELECT week('2014-09-09');
-> 2014-09-09 is in week 37

したがって、MySQL は、第 36 週の火曜日が第 37 週にあることを教えてくれます。

これについての私の唯一の説明:

  • week() は default_week_format を考慮します
  • str_to_date() は default_week_format を無視します

MySQL 関数 str_to_date に default_week_format を使用させるにはどうすればよいですか?

または: 他にどのように次の週の数を計算できますか? PHP でも実行できますが、MySQL データベースから週数を取得します。

助けてくれてありがとう!

4

2 に答える 2

1

私はまったく同じ問題に直面していました。私の解決策 - おそらく最高のものではありませんが、うまくいきます。

すでに述べたように、ほとんどの場合は些細なことであり、年末/年始を知る必要があるだけです。したがって、必要な年数に対応する週を次の表に格納するだけです。

CREATE TABLE `NEXT_WEEK_TAB` (
  `CUR_WEEK`  varchar(8) NOT NULL,
  `NEXT_WEEK` varchar(8) NOT NULL,
  PRIMARY KEY (`CUR_WEEK`,`NEXT_WEEK`)
)

現在のアルゴリズムでは、次の週が得られます。

following_week = (SELECT next_week 
                  FROM   next_week_tab 
                  WHERE  cur_week = <your_current_week>);
if !following_week then following_week++;

私が言ったように:おそらく最も良い解決策ではありませんが、それは非常に簡単です-そしてそれはうまくいきます.

于 2014-02-11T21:24:33.807 に答える
0

モード引数で Week を使用する必要があると思います

mysql> SELECT WEEK('2008-02-20',0);
        -> 7
mysql> SELECT WEEK('2008-02-20',1);
        -> 8

ここを見てください: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week

于 2014-02-10T23:10:16.670 に答える