web-dev-qa-db-ja.com

mysqlで日付の週の最初の日を取得するにはどうすればよいですか?

2011-01-03があり、週の最初、つまり日曜日、つまり2011-01-02を取得したい場合、どうすればよいですか?

理由は私がこのクエリを持っていることです:

select 
  YEAR(date_entered) as year, 
  date(date_entered) as week,   <-------This is what I want to change to select the first day of the week.
  SUM(1) as total_ncrs, 
  SUM(case when orgin = picked_up_at then 1 else 0 end) as ncrs_caught_at_station 
from sugarcrm2.ncr_ncr 
where 
sugarcrm2.ncr_ncr.date_entered > date('2011-01-01') 
and orgin in( 
'Silkscreen', 
'Brake', 
'Assembly', 
'Welding', 
'Machining', 
'2000W Laser', 
'Paint Booth 1', 
'Paint Prep', 
'Packaging', 
'PEM', 
'Deburr', 
'Laser ', 
'Paint Booth 2', 
'Toolpath' 
) 
and date_entered is not null 
and orgin is not null 
AND(grading = 'Minor' or grading = 'Major') 
 and week(date_entered) > week(current_timestamp) -20 
group by year, week(date_entered) 
order by year   asc, week asc 

そして、はい、Originのスペルが間違っていることに気づきましたが、以前はここにあったため、内部アプリが参照しているので修正できません。

だから、私は週ごとにグループ化していますが、これをグラフに入力したいので、週の初めをすべて異なる日付のように見せることはできません。どうすれば修正できますか?

22
davidahines

月曜日から始まる週を処理する必要がある場合は、その方法で行うこともできます。まず、カスタムFIRST_DAY_OF_WEEK関数を定義します。

DELIMITER ;;
CREATE FUNCTION FIRST_DAY_OF_WEEK(day DATE)
RETURNS DATE DETERMINISTIC
BEGIN
  RETURN SUBDATE(day, WEEKDAY(day));
END;;
DELIMITER ;

そして、あなたはそうすることができます:

SELECT FIRST_DAY_OF_WEEK('2011-01-03');

参考までに、MySQLには、週の最初の日を取得する2つの異なる関数が用意されています。 [〜#〜] dayofweek [〜#〜] があります:

日付の曜日インデックスを返します(1 =日曜日、2 =月曜日、…、7 =土曜日)。これらのインデックス値は、ODBC=標準に対応しています。

そして [〜#〜]平日[〜#〜]

日付の曜日インデックスを返します(0 =月曜日、1 =火曜日、…6 =日曜日)。

35
Stéphane

週が日曜日に始まる場合は、次のようにします。

DATE_ADD(mydate, INTERVAL(1-DAYOFWEEK(mydate)) DAY)

週が月曜日に始まる場合は、次のようにします。

DATE_ADD(mydate, INTERVAL(-WEEKDAY(mydate)) DAY);

詳細

80
Грозный

週が月曜日に始まる場合

  SELECT SUBDATE(mydate, weekday(mydate));

週が日曜日に始まる場合

  SELECT SUBDATE(mydate, dayofweek(mydate) - 1);

例:

SELECT SUBDATE('2018-04-11', weekday('2018-04-11'));

2018-04-09

SELECT SUBDATE('2018-04-11', dayofweek('2018-04-11') - 1);

2018-04-08

11
Egene

'2011-01-03'-INTERVAL(WEEKDAY( '2011-01-03')+ 1)DAYを選択します。

週の最初の日の日付を返します。調べてみてください。

6
Cem Güler

週は日曜日から始まり、週の最初の日付と週の最後の日付を取得します

SELECT  
  DATE("2019-03-31" + INTERVAL (1 - DAYOFWEEK("2019-03-31")) DAY) as start_date,  
  DATE("2019-03-31" + INTERVAL (7 - DAYOFWEEK("2019-03-31")) DAY) as end_date

週は月曜日から始まり、週の最初の日付と週の最後の日付を取得します

SELECT  
  DATE("2019-03-31" + INTERVAL ( - WEEKDAY("2019-03-31")) DAY) as start_date, 
  DATE("2019-03-31" + INTERVAL (6 - WEEKDAY("2019-03-31")) DAY) as end_date
4

これは、週の最初の日を決定する関数を作成するよりもはるかに簡単な方法です。

いくつかのバリアントは次のようになります
SELECT DATE_ADD((SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1)DAY),INTERVAL 7 DAY)(「開始日」と「終了日」の間など、クエリの終了日)。
SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) DAY(クエリの開始日)。

これにより、今週のすべての値が返されます。クエリの例は次のようになります。
SELECT b.foo FROM bar b
WHERE b.datefield BETWEEN
(SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) DAY)
AND
(SELECT DATE_ADD((SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1)DAY),INTERVAL 7 DAY))

1
Kenny_D

これは私を形作る作品

以下のクエリの両方の日付が同じであることを確認してください...

SELECT ('2017-10-07' - INTERVAL WEEKDAY('2017-10-07') Day) As `mondaythisweek`

このクエリは2017-10-02を返します。

しかし、あなたの最初の日が日曜日であるならば、これとワラの結果からただ日を引いてください!

0
Paul Ishak