mysql语法-日期时间函数

目录

      • 1. 获取系统日期、时间
        • 1.1 now()
        • 1.2 sysdate()
        • 1.3 curdate()
        • 1.4 curtime()
      • 2. 日期、时间相减
        • 2.1 datediff()
        • 2.2 timediff()
      • 3. 日期、时间运算函数
        • 3.1 date_add()
        • 3.2 date_sub()
      • 4. 日期、时间函数
      • 5. dayofxxx(date)显示xxx中的第几天
      • 6. 返回星期和月份名称
      • 7.unix时间戳
      • 8.date_format()函数
      • 9.小案例


1. 获取系统日期、时间

1.1 now()

now([fsp]):返回系统当前的日期和时间(fsp指定小数秒的精度,取值0-6)。

1. select now();
2. select now(2);   # 指定小数秒的精度
3. select now()+0;  # now()+0显示格式是‘YYYYMMDDHHMMSS’
->
1. 2020-02-18 19:36:39
2. 2020-02-18 19:36:39.46
3. 20200218193639

1.2 sysdate()

sysdate([fsp]):返回系统当前的日期和时间,但一般用now()。

sysdate()返回的是函数执行时的时间。
now()返回的是语句执行时的时间。

1. select sysdate();
2. select now(),sleep(2),now();
3. select sysdate(),sleep(2),sysdate();
->
1. 2020-02-18 19:36:39
2. 2020-02-18 19:42:11    0    2020-02-18 19:42:11
3. 2020-02-18 19:42:13    0    2020-02-18 19:42:15

1.3 curdate()

curdate():返回当前日期,只包含年月日。

1. select curdate();
2. select curdate()+2; # 当前日期加2天
->
1. 2020-02-18
2. 20200220

1.4 curtime()

curtime([fsp]):返回当前时间,只包含时分秒(fsp指定小数秒的精度,取值0-6)。

1. select curtime();
2. select curtime(6);
3. select curtime()+2;  # 加2秒
->
1. 19:49:39
2. 19:49:39.354219
3. 194941

2. 日期、时间相减

2.1 datediff()

datediff(expr1,expr2):返回两个日期相减的天数(expr1 - expr2)。

select datediff('2020-04-18 10:00:00','2010-02-18');
->
3712

2.2 timediff()

timediff(expr1, expr2):返回两个时间相减的时间数(expr1 − expr2),两个参数类型必须相同。范围在-838:59:59到838:59:59。

timestampdiff(unit,begin,end):根据unit单位返回时间差。

1. select timediff('18:32:59','00:1:00');
2. select timediff('2020-02-18 10:00:00','10:00:00'); # 如果传递两个不同类型的参数,返回null
3. select timediff('2020-02-18 10:00:00','2020-02-15');
4. select timediff('2020-02-18 10:00:00',null); 
5. select timediff('2020-04-18 10:00:00','2020-02-18 10:00:00'); # timediff函数返回的结果是一个time值,范围是从-838:59:59到838:59:59。当范围超过的时候,MySQL会截断结果。
6. select timestampdiff(hour,'2020-04-18 10:00:00','2020-02-18 10:00:00') # 解决范围超过截断的问题。
->
1. 18:31:59
2. null
3. null
4. null
5. 838:59:59
6. -1440

3. 日期、时间运算函数

3.1 date_add()

date_add(date,interval expr unit):返回给定日期(date)加上(add)一个时间单位(unit)的值(expr)。

1. select date_add('2020-02-18 10:00:00',interval 1 day); # 增加一天
2. select date_add('2020-02-18 10:00:00',interval 1 hour);
3. select date_add('2020-02-18 10:00:00',interval 1 second);
4. select date_add('2020-02-18 10:00:00',interval 1 microsecond); # 微秒
5. select date_add('2020-02-18 10:00:00',interval 1 year);
6. select date_add('2020-02-18 10:00:00',interval 1 month);
7. select date_add('2020-02-18 10:00:00',interval 1 day);
8. select date_add('2020-02-18 10:00:00',interval 1 week); # 一个星期,加7天
9. select date_add('2020-02-18 10:00:00',interval 1 quarter); # 1个季度,加3个月
->
1. 2020-02-19 10:00:00
2. 2020-02-18 11:00:00
3. 2020-02-18 10:00:01
4. 2020-02-18 10:00:000001
5. 2021-02-18 10:00:00
6. 2020-03-18 10:00:00
7. 2020-02-19 10:00:00
8. 2020-02-25 10:00:00
9. 2020-05-18 10:00:00

3.2 date_sub()

date_sub(date,interval expr unit):返回给定日期(date)减去(sub)一个时间单位(unit)的值(expr)。

1. select date_sub('2020-02-18',interval '1-1' year_month); # 年和月,减1年1个月
2. select date_sub('2020-02-18',interval '1 1' day_hour);  # 日和小时,减1天1小时
3. select date_sub('2020-02-18',interval '1 0:1' day_minute); # 日和分钟,减1天1分钟
4. select date_sub('2020-02-18',interval '1 0:0:1' day_second); # 日和秒,减1天1秒
5. select date_sub('2020-02-18',interval '1:1' hour_minute); # 小时和分钟,减1小时1分钟
6. select date_sub('2020-02-18',interval '1:0:1' hour_second); # 小时和秒,减1小时1秒
7. select date_sub('2020-02-18',interval '1:1' minute_second); # 分钟和秒,减1分钟1秒,写0:1:1返回空值。
->
1. 2019-01-19
2. 2020-02-16 23:00:00
3. 2020-02-16 23:59:00
4. 2020-02-16 23:59:59
5. 2020-02-17 22:59:00
6. 2020-02-17 22:59:59
7. 2020-02-17 23:58:59

4. 日期、时间函数

选取日期时间的各个部分:日期、时间、年、季度、月、日、小时、分钟、秒、微秒。

1. select now(),date(now());
2. select now(),time(now());
3. select now(),year(now());
4. select now(),quarter(now());
5. select now(),month(now());
6. select now(),day(now());
7. select now(),hour(now());
8. select now(),minute(now());
9. select now(),second(now());
10.select now(),microsecond(now());
->
1. 2020-02-18 23:18:54  2020-02-18
2. 2020-02-18 23:18:54  23:18:54
3. 2020-02-18 23:18:54  2020
4. 2020-02-18 23:18:54  1
5. 2020-02-18 23:18:54  2
6. 2020-02-18 23:18:54  18
7. 2020-02-18 23:18:54  23
8. 2020-02-18 23:18:54  18
9. 2020-02-18 23:18:54  54
10.2020-02-18 23:18:54  0

EXTRACT(unit FROM date):从日期、时间中抽取出某个单独的部分或组合。

1. SELECT now(),extract(YEAR FROM now()); -- 年
2. SELECT now(),extract(QUARTER FROM now()); -- 季度
3. SELECT now(),extract(MONTH FROM now()); -- 月
4. SELECT now(),extract(WEEK FROM now()); -- 周,开年第一个星期从0开始算
5. SELECT now(),extract(DAY FROM now()); -- 日
6. SELECT now(),extract(HOUR FROM now()); -- 小时
7. SELECT now(),extract(MINUTE FROM now()); -- 分钟
8. SELECT now(),extract(SECOND FROM now()); -- 秒
9. SELECT now(),extract(YEAR_MONTH FROM now()); -- 年月,没有月日
10.SELECT now(),extract(HOUR_MINUTE FROM now()); -- 时分
11.SELECT now(),extract(HOUR_SECOND FROM now()); -- HOUR_SECOND时秒,不能跳过分钟,返回时分秒
12.SELECT now(),extract(MINUTE_SECOND FROM now()); -- 分秒
->
1. 2020-02-18 23:18:54  2020
2. 2020-02-18 23:18:54  1
3. 2020-02-18 23:18:54  2
4. 2020-02-18 23:18:54  7  # 第7周
5. 2020-02-18 23:18:54  18
6. 2020-02-18 23:18:54  23
7. 2020-02-18 23:18:54  18
8. 2020-02-18 23:18:54  54
9. 2020-02-18 23:18:54  202002
10.2020-02-18 23:18:54  2318
11.2020-02-18 23:18:54  231854
12.2020-02-18 23:18:54  1854

5. dayofxxx(date)显示xxx中的第几天

dayofyear(date) 返回日期在一年中的第几天。
dayofweek(date) 返回日期在一周中的第几天。
dayofmonth(date) 返回日期在一月中的第几天。

1. select now(),dayofyear(now());
2. select now(),dayofweek(now()); -- 周日为1
3. select now(),dayofmonth(now());
->
1. 2020-02-18 23:42:26  49
2. 2020-02-18 23:42:26  3
3. 2020-02-18 23:42:26  18

6. 返回星期和月份名称

dayname(date) 返回星期名称
monthname(date) 返回月份名称

1. select now(),dayname(now());
2. select now(),monthname(now());

# 名称是中文or英文由系统变量lc_time_names控制(默认值是'en_US')。
show variables like 'lc_time_names';
# 设置为中文
set lc_time_names='zh_CN';

3. select dayname(now()),monthname(now());
->
1. 2020-02-18 23:42:26  Tuesday
2. 2020-02-18 23:42:26  February
3. 星期二  二月

7.unix时间戳

unix_timestamp(date):返回日期(date)的时间戳(unix)。
-若参数不为空,则返回从’1970-01-01 00:00:00’ GMT开始到指定date的秒数值。
-若参数为空,则返回从’1970-01-01 00:00:00’ GMT开始到当前时间的秒数值。

from_unixtime():返回unix时间戳的日期值。
-将秒数转为日期,带时分秒。

1. select now(),unix_timestamp(now()),unix_timestamp('2020-2-18');
2. select from_unixtime(unix_timestamp(now())),from_unixtime(unix_timestamp('2020-2-18'))
->
1. 2020-02-18 23:55:15  1582041315  1581955200
2. 2020-02-18 23:55:15  2020-02-18 00:00:00

8.date_format()函数

date_format(date,format):返回不同格式的日期或时间数据。
format格式大全

举例:
%y:年,2位数
%m:月份,数值(00-12)
%d:月的天,数值(00-31)

%Y:年,4位数
%M:月份名称
%D:带有英文前缀的月中的天

%r:时间,12-小时(hh:mm:ss AM 或 PM)

1. select date_format('2020-2-18','%y%y %m %d'),date_format('2020-2-18','%Y/%M/%D')
2. select now(),date_format(now(),'%r') 
->
1. 2020 02 18            2020/二月/18th
2. 2020-02-19 00:18:34   12:18:34 AM

9.小案例

emp表
mysql语法-日期时间函数_第1张图片

  1. 在emp表中,查询所有工龄大于35年的员工信息。
    思路1:计算每个人入职时间hiredate+35年后,与如今now()相比,是否早就超过35年,还未超过35年的一定是>now()的(红框的记录就是工龄小于35年的)。
    mysql语法-日期时间函数_第2张图片
    思路2:使用datediff()获取天数,然后除365得年份,或者使用from_days()将天数转为日期,再year()获取年份。
    mysql语法-日期时间函数_第3张图片

  2. 在emp表中, 查询在该月月底前两天入职的员工信息。
    思路:使用date_add(date,interval expr unit)函数,入职时间+2天是否等于该月最后一天last_day(date),返回是的结果。
    mysql语法-日期时间函数_第4张图片

你可能感兴趣的:(MySQL)