teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

10

テキスト修正

2018/02/15 21:25

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -54,7 +54,7 @@
54
54
  以下は動作確認のログです。
55
55
 
56
56
  ```
57
- [ykt68@macbook15 ~]$ mysql -u root -p
57
+ [ykt68@macbook15 ~]$ mysql -u root -p teratail_db
58
58
  Enter password:
59
59
  Reading table information for completion of table and column names
60
60
  You can turn off this feature to get a quicker startup with -A

9

テキスト修正

2018/02/15 21:24

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -28,10 +28,12 @@
28
28
  ```sql
29
29
  FLOOR(DATEDIFF(NOW(), birth) / 365.25))
30
30
  ```
31
- は、以下
31
+ は、stackoverflowの以下の投稿
32
+
32
33
  [how-to-calculate-age-in-years-based-on-date-of-birth-and-getdate](https://stackoverflow.com/questions/1572110/how-to-calculate-age-in-years-based-on-date-of-birth-and-getdate)
33
- の回答に出ていた
34
34
 
35
+ の回答に出ていた、シンプルなコード
36
+
35
37
  ```
36
38
  I have used this query in our production code for nearly 10 years:
37
39
 
@@ -43,8 +45,10 @@
43
45
  の算出方法を("in our production code for nearly 10 years"と言っているのを信じて)使いました。
44
46
  ただし、この回答のコメントにあるように、少し不正確なところがあります。
45
47
 
46
- また、年齢の区分によって GROUP BY するのは、
48
+ また、年齢の区分によって GROUP BY するのは、同じくstackoverflowの
49
+
47
50
  [sql-group-by-age-range](https://stackoverflow.com/questions/8762886/sql-group-by-age-range)
51
+
48
52
  を参考にしました。
49
53
 
50
54
  以下は動作確認のログです。

8

テキスト修正

2018/02/15 21:12

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -3,22 +3,22 @@
3
3
 
4
4
  ```sql
5
5
  SELECT
6
- age_range AS '年齢区分' ,
6
+ age_range AS '年齢区分' ,
7
- COUNT(*) AS '人数'
7
+ COUNT(*) AS '人数'
8
8
  FROM (
9
- SELECT
9
+ SELECT
10
- name, birth,
10
+ name, birth,
11
- (@age:=FLOOR(DATEDIFF(NOW(), birth) / 365.25)) AS age,
11
+ (@age:=FLOOR(DATEDIFF(NOW(), birth) / 365.25)) AS age,
12
- (
12
+ (
13
- CASE
13
+ CASE
14
- WHEN @age < 18 THEN '18歳未満'
14
+ WHEN @age < 18 THEN '18歳未満'
15
- WHEN @age BETWEEN 18 AND 34 THEN '18歳以上 34歳以下'
15
+ WHEN @age < 35 THEN '18歳以上 34歳以下'
16
- WHEN @age BETWEEN 35 AND 44 THEN '35歳以上 44歳以下'
16
+ WHEN @age < 45 THEN '35歳以上 44歳以下'
17
- WHEN @age BETWEEN 45 AND 54 THEN '45歳以上 54歳以下'
17
+ WHEN @age < 55 THEN '45歳以上 54歳以下'
18
- WHEN @age BETWEEN 55 AND 64 THEN '55歳以上 64歳以下'
18
+ WHEN @age < 65 THEN '55歳以上 64歳以下'
19
- ELSE '65歳以上'
19
+ ELSE '65歳以上'
20
- END ) AS age_range
20
+ END ) AS age_range
21
- FROM q113552
21
+ FROM q113552
22
22
  ) table_with_age_range
23
23
  GROUP BY age_range
24
24
  ORDER BY age_range;
@@ -84,22 +84,22 @@
84
84
  9 rows in set (0.00 sec)
85
85
 
86
86
  mysql> SELECT
87
- -> age_range AS '年齢区分' ,
87
+ -> age_range AS '年齢区分' ,
88
- -> COUNT(*) AS '人数'
88
+ -> COUNT(*) AS '人数'
89
89
  -> FROM (
90
- -> SELECT
90
+ -> SELECT
91
- -> name, birth,
91
+ -> name, birth,
92
- -> (@age:=FLOOR(DATEDIFF(NOW(), birth) / 365.25)) AS age,
92
+ -> (@age:=FLOOR(DATEDIFF(NOW(), birth) / 365.25)) AS age,
93
- -> (
93
+ -> (
94
- -> CASE
94
+ -> CASE
95
- -> WHEN @age < 18 THEN '18歳未満'
95
+ -> WHEN @age < 18 THEN '18歳未満'
96
- -> WHEN @age BETWEEN 18 AND 34 THEN '18歳以上 34歳以下'
96
+ -> WHEN @age < 35 THEN '18歳以上 34歳以下'
97
- -> WHEN @age BETWEEN 35 AND 44 THEN '35歳以上 44歳以下'
97
+ -> WHEN @age < 45 THEN '35歳以上 44歳以下'
98
- -> WHEN @age BETWEEN 45 AND 54 THEN '45歳以上 54歳以下'
98
+ -> WHEN @age < 55 THEN '45歳以上 54歳以下'
99
- -> WHEN @age BETWEEN 55 AND 64 THEN '55歳以上 64歳以下'
99
+ -> WHEN @age < 65 THEN '55歳以上 64歳以下'
100
- -> ELSE '65歳以上'
100
+ -> ELSE '65歳以上'
101
- -> END ) AS age_range
101
+ -> END ) AS age_range
102
- -> FROM q113552
102
+ -> FROM q113552
103
103
  -> ) table_with_age_range
104
104
  -> GROUP BY age_range
105
105
  -> ORDER BY age_range;
@@ -110,11 +110,11 @@
110
110
  | 35歳以上 44歳以下 | 2 |
111
111
  | 45歳以上 54歳以下 | 1 |
112
112
  | 55歳以上 64歳以下 | 2 |
113
- | 65歳以上 | 1 |
113
+ | 65歳以上 | 1 |
114
114
  +-------------------------+--------+
115
115
  5 rows in set (0.00 sec)
116
116
 
117
- mysql>
117
+ mysql>
118
118
 
119
119
  ```
120
120
 

7

テキスト修正

2018/02/15 20:57

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  ```sql
5
5
  SELECT
6
- age_span AS '年齢区分' ,
6
+ age_range AS '年齢区分' ,
7
7
  COUNT(*) AS '人数'
8
8
  FROM (
9
9
  SELECT
@@ -12,16 +12,16 @@
12
12
  (
13
13
  CASE
14
14
  WHEN @age < 18 THEN '18歳未満'
15
- WHEN @age < 35 THEN '18歳以上 34歳以下'
15
+ WHEN @age BETWEEN 18 AND 34 THEN '18歳以上 34歳以下'
16
- WHEN @age < 45 THEN '35歳以上 44歳以下'
16
+ WHEN @age BETWEEN 35 AND 44 THEN '35歳以上 44歳以下'
17
- WHEN @age < 55 THEN '45歳以上 54歳以下'
17
+ WHEN @age BETWEEN 45 AND 54 THEN '45歳以上 54歳以下'
18
- WHEN @age < 65 THEN '55歳以上 64歳以下'
18
+ WHEN @age BETWEEN 55 AND 64 THEN '55歳以上 64歳以下'
19
- ELSE '65歳以上'
19
+ ELSE '65歳以上'
20
- END ) AS age_span
20
+ END ) AS age_range
21
21
  FROM q113552
22
- ) table_with_age_span
22
+ ) table_with_age_range
23
- GROUP BY age_span
23
+ GROUP BY age_range
24
- ORDER BY age_span;
24
+ ORDER BY age_range;
25
25
  ```
26
26
    
27
27
  年齢を算出する
@@ -84,7 +84,7 @@
84
84
  9 rows in set (0.00 sec)
85
85
 
86
86
  mysql> SELECT
87
- -> age_span AS '年齢区分' ,
87
+ -> age_range AS '年齢区分' ,
88
88
  -> COUNT(*) AS '人数'
89
89
  -> FROM (
90
90
  -> SELECT
@@ -93,16 +93,16 @@
93
93
  -> (
94
94
  -> CASE
95
95
  -> WHEN @age < 18 THEN '18歳未満'
96
- -> WHEN @age < 35 THEN '18歳以上 34歳以下'
96
+ -> WHEN @age BETWEEN 18 AND 34 THEN '18歳以上 34歳以下'
97
- -> WHEN @age < 45 THEN '35歳以上 44歳以下'
97
+ -> WHEN @age BETWEEN 35 AND 44 THEN '35歳以上 44歳以下'
98
- -> WHEN @age < 55 THEN '45歳以上 54歳以下'
98
+ -> WHEN @age BETWEEN 45 AND 54 THEN '45歳以上 54歳以下'
99
- -> WHEN @age < 65 THEN '55歳以上 64歳以下'
99
+ -> WHEN @age BETWEEN 55 AND 64 THEN '55歳以上 64歳以下'
100
- -> ELSE '65歳以上'
100
+ -> ELSE '65歳以上'
101
- -> END ) AS age_span
101
+ -> END ) AS age_range
102
102
  -> FROM q113552
103
- -> ) table_with_age_span
103
+ -> ) table_with_age_range
104
- -> GROUP BY age_span
104
+ -> GROUP BY age_range
105
- -> ORDER BY age_span;
105
+ -> ORDER BY age_range;
106
106
  +-------------------------+--------+
107
107
  | 年齢区分 | 人数 |
108
108
  +-------------------------+--------+

6

テキスト修正

2018/02/14 22:58

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -40,7 +40,7 @@
40
40
  J__ answered Oct 15 '09 at 13:07
41
41
  ```
42
42
 
43
- "in our production code for nearly 10 years" と言っているのを信じて )使いました。
43
+ の算出方法を("in our production code for nearly 10 years"と言っているのを信じて)使いました。
44
44
  ただし、この回答のコメントにあるように、少し不正確なところがあります。
45
45
 
46
46
  また、年齢の区分によって GROUP BY するのは、

5

テキスト修正

2018/02/14 22:49

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -1,4 +1,5 @@
1
1
  MySQL 5.6 にて、以下のクエリで動作を確認しました。
2
+ (※テーブル名は、`q113552` としています。)
2
3
 
3
4
  ```sql
4
5
  SELECT
@@ -46,7 +47,7 @@
46
47
  [sql-group-by-age-range](https://stackoverflow.com/questions/8762886/sql-group-by-age-range)
47
48
  を参考にしました。
48
49
 
49
- 以下は動作確認のログです。(※テーブル名は、`q113552` としています。)
50
+ 以下は動作確認のログです。
50
51
 
51
52
  ```
52
53
  [ykt68@macbook15 ~]$ mysql -u root -p

4

テキスト修正

2018/02/14 22:41

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -125,7 +125,7 @@
125
125
  > 年齢計算のSQL
126
126
  > (YEAR(create()) - YEAR(birth)) - (RIGHT(create(), 5) < RIGHT(birth, 5)) AS age from table;
127
127
 
128
- を、そのまま使うと以下のようにエラーになりました。
128
+ を、そのまま使うと以下のようにエラーになりました。質問者様のお使いの MySQL と、私の使っている MySQL とのバージョン違いの問題でしょうか?
129
129
 
130
130
  ```
131
131
  mysql> SELECT name, birth, (YEAR(create()) - YEAR(birth)) - (RIGHT(create(), 5) < RIGHT(birth, 5)) AS age FROM q113552;

3

テキスト修正

2018/02/14 22:35

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -31,14 +31,17 @@
31
31
  [how-to-calculate-age-in-years-based-on-date-of-birth-and-getdate](https://stackoverflow.com/questions/1572110/how-to-calculate-age-in-years-based-on-date-of-birth-and-getdate)
32
32
  の回答に出ていた
33
33
 
34
+ ```
34
- > I have used this query in our production code for nearly 10 years:
35
+ I have used this query in our production code for nearly 10 years:
35
- >
36
- > SELECT FLOOR((CAST (GetDate() AS INTEGER) - CAST(Date_of_birth AS INTEGER)) / 365.25) AS Age
37
- >
38
- > J__ answered Oct 15 '09 at 13:07
39
36
 
40
- を使いました。ただし、この回答のコメントにあるように、少し不正確なところがあります。
37
+ SELECT FLOOR((CAST (GetDate() AS INTEGER) - CAST(Date_of_birth AS INTEGER)) / 365.25) AS Age
41
38
 
39
+ J__ answered Oct 15 '09 at 13:07
40
+ ```
41
+
42
+ を、( "in our production code for nearly 10 years" と言っているのを信じて )使いました。
43
+ ただし、この回答のコメントにあるように、少し不正確なところがあります。
44
+
42
45
  また、年齢の区分によって GROUP BY するのは、
43
46
  [sql-group-by-age-range](https://stackoverflow.com/questions/8762886/sql-group-by-age-range)
44
47
  を参考にしました。

2

テキスト修正

2018/02/14 22:32

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -1,4 +1,4 @@
1
- 以下のSQLやってみました。
1
+ MySQL 5.6 にて、以下のクエリ動作を確認しました。
2
2
 
3
3
  ```sql
4
4
  SELECT

1

テキスト修正

2018/02/14 22:29

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -43,7 +43,8 @@
43
43
  [sql-group-by-age-range](https://stackoverflow.com/questions/8762886/sql-group-by-age-range)
44
44
  を参考にしました。
45
45
 
46
- 以下は動作確認のログです。
46
+ 以下は動作確認のログです。(※テーブル名は、`q113552` としています。)
47
+
47
48
  ```
48
49
  [ykt68@macbook15 ~]$ mysql -u root -p
49
50
  Enter password:
@@ -111,4 +112,19 @@
111
112
 
112
113
  mysql>
113
114
 
115
+ ```
116
+
117
+ ---
118
+ **補足**
119
+
120
+ ご質問に挙がっていた、
121
+
122
+ > 年齢計算のSQL
123
+ > (YEAR(create()) - YEAR(birth)) - (RIGHT(create(), 5) < RIGHT(birth, 5)) AS age from table;
124
+
125
+ を、そのまま使うと以下のようにエラーになりました。
126
+
127
+ ```
128
+ mysql> SELECT name, birth, (YEAR(create()) - YEAR(birth)) - (RIGHT(create(), 5) < RIGHT(birth, 5)) AS age FROM q113552;
129
+ ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'create()) - YEAR(birth)) - (RIGHT(create(), 5) < RIGHT(birth, 5)) AS age FROM q1' at line 1
114
130
  ```