{"id":94,"date":"2009-11-24T08:49:34","date_gmt":"2009-11-24T14:49:34","guid":{"rendered":"http:\/\/thenoyes.com\/littlenoise\/?p=94"},"modified":"2010-06-30T07:59:58","modified_gmt":"2010-06-30T12:59:58","slug":"group-date","status":"publish","type":"post","link":"https:\/\/thenoyes.com\/littlenoise\/?p=94","title":{"rendered":"group date"},"content":{"rendered":"<p>A non-rigorous, non-scientific, totally off-the-cuff test of which function to pick when you need to group by year and month.<\/p>\n<p>I populated a table with 262K rows of random dates, and then ran <\/p>\n<p><code>SELECT %s, COUNT(*) FROM table GROUP BY %s ORDER BY NULL<\/code><\/p>\n<p>with various functions, which should all result in the same grouping. I repeated each query five times and show the average time, using three different column types DATE, DATETIME, and TIMESTAMP.<\/p>\n<table>\n<tr>\n<th>expression<\/th>\n<th>DATE<\/th>\n<th>DATETIME<\/th>\n<th>TIMESTAMP<\/th>\n<\/tr>\n<tr>\n<td>EXTRACT(YEAR_MONTH FROM d)<\/td>\n<td align='right'>0.362<\/td>\n<td align='right'>0.369<\/td>\n<td align='right'>0.581<\/td>\n<\/tr>\n<tr>\n<td>LAST_DAY(d)<\/td>\n<td align='right'>0.374<\/td>\n<td align='right'>0.389<\/td>\n<td align='right'>0.582<\/td>\n<\/tr>\n<tr>\n<td>DATE_SUB(d, INTERVAL DAY(d) DAY)<\/td>\n<td align='right'>0.429<\/td>\n<td align='right'>0.882<\/td>\n<td align='right'>1.452<\/td>\n<\/tr>\n<tr>\n<td>d &#8211; INTERVAL DAY(d) DAY<\/td>\n<td align='right'>0.429<\/td>\n<td align='right'>0.887<\/td>\n<td align='right'>1.535<\/td>\n<\/tr>\n<tr>\n<td>SUBSTRING(d, 1, 7)<\/td>\n<td align='right'>0.454<\/td>\n<td align='right'>0.488<\/td>\n<td align='right'>0.719<\/td>\n<\/tr>\n<tr>\n<td>YEAR(d), MONTH(d)<\/td>\n<td align='right'>1.046<\/td>\n<td align='right'>1.126<\/td>\n<td align='right'>2.045<\/td>\n<\/tr>\n<tr>\n<td>MONTH(d), YEAR(d)<\/td>\n<td align='right'>1.116<\/td>\n<td align='right'>1.196<\/td>\n<td align='right'>2.112<\/td>\n<\/tr>\n<tr>\n<td>LEFT(d, 7)<\/td>\n<td align='right'>1.307<\/td>\n<td align='right'>1.405<\/td>\n<td align='right'>2.123<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%Y%m&#8217;)<\/td>\n<td align='right'>1.480<\/td>\n<td align='right'>1.565<\/td>\n<td align='right'>2.112<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%Y-%m&#8217;)<\/td>\n<td align='right'>1.514<\/td>\n<td align='right'>1.615<\/td>\n<td align='right'>2.564<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%m%Y&#8217;)<\/td>\n<td align='right'>1.517<\/td>\n<td align='right'>1.604<\/td>\n<td align='right'>2.420<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%m-%Y&#8217;)<\/td>\n<td align='right'>1.562<\/td>\n<td align='right'>1.656<\/td>\n<td align='right'>2.465<\/td>\n<\/tr>\n<tr>\n<td>MONTHNAME(d), YEAR(d)<\/td>\n<td align='right'>1.613<\/td>\n<td align='right'>1.713<\/td>\n<td align='right'>2.812<\/td>\n<\/tr>\n<tr>\n<td>YEAR(d), MONTHNAME(d)<\/td>\n<td align='right'>1.663<\/td>\n<td align='right'>1.766<\/td>\n<td align='right'>2.873<\/td>\n<\/tr>\n<\/table>\n<p>And just in case you want to extract a full date (which really only makes sense for datetime and timestamp):<\/p>\n<table>\n<tr>\n<th>expression<\/th>\n<th>DATE<\/th>\n<th>DATETIME<\/th>\n<th>TIMESTAMP<\/th>\n<\/tr>\n<tr>\n<td>DATE(d)<\/td>\n<td align='right'>0.357<\/td>\n<td align='right'>0.374<\/td>\n<td align='right'>0.591<\/td>\n<\/tr>\n<tr>\n<td>EXTRACT(YEAR_MONTH FROM d), EXTRACT(DAY FROM d)<\/td>\n<td align='right'>0.377<\/td>\n<td align='right'>0.407<\/td>\n<td align='right'>0.730<\/td>\n<\/tr>\n<tr>\n<td>EXTRACT(DAY FROM d), EXTRACT(YEAR_MONTH FROM d)<\/td>\n<td align='right'>0.395<\/td>\n<td align='right'>0.422<\/td>\n<td align='right'>0.751<\/td>\n<\/tr>\n<tr>\n<td>MONTH(d), YEAR(d), DAY(d)<\/td>\n<td align='right'>0.395<\/td>\n<td align='right'>0.426<\/td>\n<td align='right'>0.870<\/td>\n<\/tr>\n<tr>\n<td>YEAR(d), DAY(d), MONTH(d)<\/td>\n<td align='right'>0.398<\/td>\n<td align='right'>0.440<\/td>\n<td align='right'>0.862<\/td>\n<\/tr>\n<tr>\n<td>YEAR(d), MONTH(d), DAY(d)<\/td>\n<td align='right'>0.406<\/td>\n<td align='right'>0.441<\/td>\n<td align='right'>0.867<\/td>\n<\/tr>\n<tr>\n<td>DAY(d), YEAR(d), MONTH(d)<\/td>\n<td align='right'>0.409<\/td>\n<td align='right'>0.444<\/td>\n<td align='right'>0.859<\/td>\n<\/tr>\n<tr>\n<td>LEFT(d, 10)<\/td>\n<td align='right'>0.437<\/td>\n<td align='right'>0.487<\/td>\n<td align='right'>0.728<\/td>\n<\/tr>\n<tr>\n<td>SUBSTRING_INDEX(d, &#8216; &#8216;, 1)<\/td>\n<td align='right'>0.439<\/td>\n<td align='right'>0.475<\/td>\n<td align='right'>0.743<\/td>\n<\/tr>\n<tr>\n<td>DAY(d), MONTH(d), YEAR(d)<\/td>\n<td align='right'>0.441<\/td>\n<td align='right'>0.477<\/td>\n<td align='right'>0.901<\/td>\n<\/tr>\n<tr>\n<td>MONTH(d), DAY(d), YEAR(d)<\/td>\n<td align='right'>0.442<\/td>\n<td align='right'>0.472<\/td>\n<td align='right'>0.914<\/td>\n<\/tr>\n<tr>\n<td>SUBSTRING(d, 1, 10)<\/td>\n<td align='right'>0.460<\/td>\n<td align='right'>0.496<\/td>\n<td align='right'>0.729<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%d%Y%m&#8217;)<\/td>\n<td align='right'>0.539<\/td>\n<td align='right'>0.571<\/td>\n<td align='right'>0.852<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%m%Y%d&#8217;)<\/td>\n<td align='right'>0.542<\/td>\n<td align='right'>0.570<\/td>\n<td align='right'>0.841<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%m%d%Y&#8217;)<\/td>\n<td align='right'>0.543<\/td>\n<td align='right'>0.572<\/td>\n<td align='right'>0.846<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%Y%m%d&#8217;)<\/td>\n<td align='right'>0.544<\/td>\n<td align='right'>0.570<\/td>\n<td align='right'>0.842<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%Y%d%m&#8217;)<\/td>\n<td align='right'>0.544<\/td>\n<td align='right'>0.572<\/td>\n<td align='right'>0.843<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%d-%Y-%d&#8217;)<\/td>\n<td align='right'>0.547<\/td>\n<td align='right'>0.574<\/td>\n<td align='right'>0.848<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%d%m%Y&#8217;)<\/td>\n<td align='right'>0.549<\/td>\n<td align='right'>0.573<\/td>\n<td align='right'>0.842<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%m-%Y-%d&#8217;)<\/td>\n<td align='right'>0.552<\/td>\n<td align='right'>0.583<\/td>\n<td align='right'>0.869<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%Y-%m-%d&#8217;)<\/td>\n<td align='right'>0.558<\/td>\n<td align='right'>0.583<\/td>\n<td align='right'>0.854<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%Y-%d-%m&#8217;)<\/td>\n<td align='right'>0.569<\/td>\n<td align='right'>0.593<\/td>\n<td align='right'>0.867<\/td>\n<\/tr>\n<tr>\n<td>d &#8211; INTERVAL HOUR(d) HOUR &#8211; INTERVAL MINUTE(d) MINUTE &#8211; INTERVAL SECOND(d) SECOND<\/td>\n<td align='right'>0.573<\/td>\n<td align='right'>0.653<\/td>\n<td align='right'>1.249<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%d-%m-%Y&#8217;)<\/td>\n<td align='right'>0.598<\/td>\n<td align='right'>0.637<\/td>\n<td align='right'>0.920<\/td>\n<\/tr>\n<tr>\n<td>DATE_FORMAT(d, &#8216;%m-%d-%Y&#8217;)<\/td>\n<td align='right'>0.601<\/td>\n<td align='right'>0.633<\/td>\n<td align='right'>0.904<\/td>\n<\/tr>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>A non-rigorous, non-scientific, totally off-the-cuff test of which function to pick when you need to group by year and month. I populated a table with 262K rows of random dates, and then ran SELECT %s, COUNT(*) FROM table GROUP BY %s ORDER BY NULL with various functions, which should all result in the same grouping. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[4],"tags":[],"class_list":["post-94","post","type-post","status-publish","format-standard","hentry","category-mysql"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p2IBF1-1w","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/thenoyes.com\/littlenoise\/index.php?rest_route=\/wp\/v2\/posts\/94","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thenoyes.com\/littlenoise\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thenoyes.com\/littlenoise\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thenoyes.com\/littlenoise\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thenoyes.com\/littlenoise\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=94"}],"version-history":[{"count":1,"href":"https:\/\/thenoyes.com\/littlenoise\/index.php?rest_route=\/wp\/v2\/posts\/94\/revisions"}],"predecessor-version":[{"id":115,"href":"https:\/\/thenoyes.com\/littlenoise\/index.php?rest_route=\/wp\/v2\/posts\/94\/revisions\/115"}],"wp:attachment":[{"href":"https:\/\/thenoyes.com\/littlenoise\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=94"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thenoyes.com\/littlenoise\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=94"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thenoyes.com\/littlenoise\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=94"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}