假如有个表commodity
有个字段add_time,它的数据类型为datetime,有人可能会这样写sql:
1 | select * from product where add_time = '2013-01-12'; |
这种语句,如果你存储的格式是YY-mm-dd这样,那么OK,
如果你存储的格式是:2018-01-12 23:23:56 这种就悲剧了,此时你可以用 DATE() 函数用来返回日期的部分;sql如下处理:
1 | select * from product where Date(add_time) = '2018-01-12' |
- 如果你要查询2017年1月份加入的产品呢?
1 | select * from product where date(add_time) between '2013-01-01' and '2013-01-31' |
或者: 还可以这样写:
1 | select * from product where Year(add_time) = 2013 and Month(add_time) = 1 |
- 其date_col的值是在最后30天以内:
1 | SELECT * FROM commodity WHERE TO_DAYS( NOW() ) - TO_DAYS( date_col ) <= 30; |
- DAYOFWEEK(date) : 返回日期date的星期索引(1=星期天, 7=星期六) 这些索引值对应于ODBC标准。
1 | select DAYOFWEEK('1998-02-03'); -> 3 |
- WEEKDAY(date) : 返回date的星期索引 (0=星期一, 6= 星期天)
1 | select WEEKDAY('1997-10-04 22:23:00'); -> 5 |
- DAYOFMONTH(date) : 返回date的月份中日期,在1到31范围内。
1 | select DAYOFMONTH('1998-02-03'); -> 3 |
- DAYOFYEAR(date) : 返回date在一年中的日数, 在1到366范围内。
1 | select DAYOFYEAR('1998-02-03'); -> 34 |
- MONTH(date) : 返回date的月份,范围1到12。
1 | select MONTH('1998-02-03'); -> 2 |
- DAYNAME(date) : 返回date的星期名字。
1 | select DAYNAME("1998-02-05"); -> 'Thursday' |
- MONTHNAME(date) : 返回date的月份名字。
1 | select MONTHNAME("1998-02-05"); -> 'February' |
- QUARTER(date) : 返回date一年中的季度,范围1到4。
1 | select QUARTER('98-04-01'); -> 2 |
这是做统计数据时候用了的sql.
查询今天、昨天、一周内、8周、12周等数据 直接在sql写时间查询。 避免时区转化。数据库我们使用的UTC时间。
Today
1
2SELECT str_to_date(curdate(),'%Y-%m-%d %H:%i:%s') as todayBegin;
SELECT date_add(date_add(str_to_date(curdate(),'%Y-%m-%d %H:%i:%s'),interval 1 DAY),INTERVAL -1 SECOND) as todayEnd;昨天
``sql
SELECT str_to_date(date_sub(curdate(), interval 1 day),’%Y-%m-%d %H:%i:%s’) as yestodayBegin;
SELECT date_add(date_add(str_to_date(date_sub(curdate(), interval 1 day),’%Y-%m-%d %H:%i:%s’),interval 1 DAY),INTERVAL -1 SECOND) as yestodayEnd;1
2
3
4
5
6
- 最近7天 Last Seven days
```sql
SELECT str_to_date(date_sub(curdate(), interval 6 day),'%Y-%m-%d %H:%i:%s') as lastSevenDaysBegin;
SELECT date_add(date_add(str_to_date(curdate(),'%Y-%m-%d %H:%i:%s'),interval 1 DAY),INTERVAL -1 SECOND) as todayEnd;最近14天 Last Fourteen days
1
2SELECT str_to_date(date_sub(curdate(), interval 13 day),'%Y-%m-%d %H:%i:%s') as lastFourteenDaysBegin;
SELECT date_add(date_add(str_to_date(curdate(),'%Y-%m-%d %H:%i:%s'),interval 1 DAY),INTERVAL -1 SECOND) as todayEnd;最近30天 Last Thirty days
1
2SELECT str_to_date(date_sub(curdate(), interval 29 day),'%Y-%m-%d %H:%i:%s') as lastThirtyDaysBegin;
SELECT date_add(date_add(str_to_date(curdate(),'%Y-%m-%d %H:%i:%s'),interval 1 DAY),INTERVAL -1 SECOND) as todayEnd;最近8周 Last eight weeks
1
2SELECT str_to_date(date_sub(curdate(), interval 8 week),'%Y-%m-%d %H:%i:%s') as lastEightWeeksBegin;
SELECT date_add(date_add(str_to_date(curdate(),'%Y-%m-%d %H:%i:%s'),interval 1 DAY),INTERVAL -1 SECOND) as todayEnd;12 最近12周 Last twelve weeks
1
2SELECT str_to_date(date_sub(curdate(), interval 12 week),'%Y-%m-%d %H:%i:%s') as lastTwelveWeeksBegin;
SELECT date_add(date_add(str_to_date(curdate(),'%Y-%m-%d %H:%i:%s'),interval 1 DAY),INTERVAL -1 SECOND) as todayEnd;最近3月 Last three month
``sql
SELECT str_to_date(date_sub(curdate(), interval 3 month),’%Y-%m-%d %H:%i:%s’) as lastThreeMonthBegin;1
2
3
4
5
- 未来3天 Three day later
```sql
SELECT str_to_date(date_sub(curdate(), interval -3 day),'%Y-%m-%d %H:%i:%s') as threeDaysLaterEnd;未来3月 Three months later
1
SELECT str_to_date(date_sub(curdate(), interval -3 month),'%Y-%m-%d %H:%i:%s') as threeMonthsLaterEnd;
取一天的开始时间
1
SELECT str_to_date(DATE_FORMAT('2018-03-03','%Y-%m-%d'),'%Y-%m-%d %H:%i:%s');
取第二天的开始时间
1
2select DATE_ADD(str_to_date(DATE_FORMAT(NOW(),'%Y-%m-%d'),'%Y-%m-%d %H:%i:%s'),INTERVAL 1 DAY);
select DATE_ADD(str_to_date(DATE_FORMAT('2018-03-03','%Y-%m-%d'),'%Y-%m-%d %H:%i:%s'),INTERVAL 1 DAY);取一天的结束时间
1
2select DATE_ADD(DATE_ADD(str_to_date(DATE_FORMAT(NOW(),'%Y-%m-%d'),'%Y-%m-%d %H:%i:%s'),INTERVAL 1 DAY),INTERVAL -1 SECOND);
select DATE_ADD(DATE_ADD(str_to_date(DATE_FORMAT('2018-03-03','%Y-%m-%d'),'%Y-%m-%d %H:%i:%s'),INTERVAL 1 DAY),INTERVAL -1 SECOND);