d -- 不带前导0的数字日,如1 dd -- 带前导0的数字日,如 01
h -- 12小时制不带前导0的数字小时,如5 hh -- 12小时制带前导0的数字小时,如05 H -- 24小时制不带前导0的数字小时,如5 HH -- 24小时制带前导0的数字小时,如17 m -- 不带前导0的数字分钟,如1 mm -- 带前导0的数字分钟,如01 s -- 不带前导0的数字秒,如1 ss -- 带前导0的数字秒,如01 - -- 通用日期分隔符,也有用/的 : -- 通用时间分隔符 z -- 时区,如CST, GMT等 en -- 字符编码:英文 zh -- 字符编码:中文
3、在本系统中,日期格式可以通过以下函数来进行测试:
select formatdatetime(timestamp '2014-08-11 17:11:20', 'yyyy-MMM-dd HH:mm:ss z','en','GMT');
演示-时间格式
依次演示:yy、yyyy、M、MM、MMM、EEEE、w、dd、hh、HH、z、zh、en、GMT等时间格式。
练习-今天日期格式 (5分钟)
以“Tuesday 2014-January-10 09:10:29 GMT”的格式显示当前时间,字段名为now。 提醒:当前时间可以用current_timestamp()函数。
5-5时间函数-当前时间
注意:时间函数在不同的数据库中会有不同,以下仅表示本系统的函数。 当前时间的函数
current_date -- 当前日期
current_time -- 当前时间 current_timestamp -- 当前日期时间
演示-当前时间
依次演示当前时间的函数,显示它们的差异。
select formatdatetime(current_date, 'yyyy-MM-dd HH:mm:ss') date, formatdatetime(current_time, 'yyyy-MM-dd HH:mm:ss') time,
formatdatetime(current_timestamp, 'yyyy-MM-dd HH:mm:ss') datetime;
5-6时间函数-分解
分解函数 1、常用函数
day_of_year -- 一年中的第几天 day_of_month -- 一月中的第几天
day_of_week -- 一周中的第几天(周日是1) dayname -- 星期几 monthname -- 月份 year -- 年 quarter -- 季度 month -- 月 week -- 周 day -- 天 hour -- 小时 minute -- 分钟 second -- 秒
2、extract函数,例如
select extract(year from current_timestamp()); 参数可为:year|yy|month|MM|week|day|dd|day_of_year|
doy|hour|hh|minute|mi|second|ss|millsecond|ms
演示-时间分解函数
用两种方式分解出当前时间的:年、月、日、小时、分钟、秒。 1、用year、month、day、hour、minute、second等函数
select year(current_date) year, month(current_date) month, day(current_date) day,hour(current_time) hour,
minute(current_time) minute,second(current_time) second;
2、用extract函数
select extract(year from current_date) year, extract(month from current_date) month,
extract(day from current_date) day, extract(hour from current_time) hour, extract(minute from current_time) minute,
extract(second from current_time) second;
练习-分解时间
(5分钟)从当前时间分解出:今年的第几天(doy)、月份全称(month)、第几周(week)、星期几(dayname)。 练习-员工星期几聘用
(5分钟)显示员工的姓氏、聘用日期和聘用是星期几(dayname),按照聘用日期在星期中的顺序(从星期日为1开始)排序。
提醒:显示星期几用dayname函数,排序用day_of_week函数。
5-7时间函数-计算
由于时间是以内置数字格式存储的,实际上可以很轻松的进行计算。 1、时间相加:dateadd、timestampadd
dateadd(unitString, addInt, timestamp),例如:
dateadd('month',1,date '2014-01-31') --> 2014-02-28
2、时间相减:datediff、timestampdiff
datediff(unitString, time1, time2); // time2 - time1
问题:时间怎么除呢? 演示-时间计算函数
1、显示当前时间增加(减少)1年、1月、1天、1小时的时间。
select dateadd('year',1,current_date) addyear;
select dateadd('month',1,current_date) addmonth;
select dateadd('day',1,current_date) addday; select timestampadd('hour',1,current_time) addhour;
2、显示当前时间与2008年8月8日之间相差多少天。
select datediff('day',date '2008-08-08', current_date) daydiff;
练习-时间多次相加
(5分钟)将当前日期增加1年又3个月又3天。注解:可以函数嵌套。
5-8时间函数-转换
时间与字符串之间可以互相进行转换。 1、时间转字符串:fotmatdatetime
formatdatetime(timestamp, formatString [,localeString [, timeZoneString]])
formatdatetime(timestamp '2014-01-01 23:10:20',
'yyyy-MMM-dd hh:mm:ss z','zh','GMT')
2、字符串转时间:parsedatetime
parsedatetime(string, formatString [,localeString [, timeZoneString]])
parsedatetime('Sat, 3 Feb 2001 03:05:06 GMT', 'EEE, d MMM yyyy HH:mm:ss z', 'en', 'GMT')
演示-时间转换函数
1、将当前时间显示为 'EEE MMM/dd/yyyy HH:mm:ss'
select formatdatetime(current_timestamp,'EEE MMM/dd/yyyy HH:mm:ss') time;
2、将'2008:08:08'转换为日期时间
select parsedatetime('2008:08:08','yyyy:MM:dd');
3、将2的结果日期以1的格式显示出来
select formatdatetime(parsedatetime('2008:08:08','yyyy:MM:dd'), 'EEE MMM/dd/yyyy HH:mm:ss') time;
练习-薪资复核日期
(20分钟)显示所有员工的姓氏、聘用日期和薪金复核日期,薪金复核日期是在入职6个月后的当月第二个星期五。 提醒:1、6个月后用dateadd
2、第二个星期五,要先将年月分解出来,用字符串拼接,然后用 parsedate转换回日期。格式需要用到 'EEE W',如
prasedatetime('2014-12 Fri,2' , 'yyyy-M EEE,W','en'),记得要星期几英文用'en',中文不用。
3、parsedate转换成时间后,会带有小时、分钟等信息,如果不想显示可以用formatdatetime函数。
5-9 to_char函数
1、使用to_char函数处理时间
to_char(value, formatString),类似formatdatetime函数,如 to_char(date '2010-01-01', 'yyyy/MMM/dd');
2、使用to_char函数处理数字,格式元素如下: 9 数字个数 999999 --> 1234
0 前导0 009999 --> 001234 $ 美元符号 $999999 --> $1234 L 当地货币 L999999 --> ¥1234 . 小数点位置 99999.99 --> 1234.00 , 逗号位置 999,999 --> 1,234 ...
演示-to_char
演示用to_char函数处理日期、数字。
1、日期select to_char(date '2013-01-05','DD Month yyyy') datestr; 2、数字
select to_char(1234, '$099,999.00') salary;
练习-预期工资
(10分钟)用to_char函数显示所有员工的姓氏、工资、预期工资(dream),预期工资为3倍的现有工资,工资和预期工资都要求格式为\¥***,***.00\(人民币符号开头,两位小数、每三位一个逗号),另外显示聘用日期(hire_date),要求格式为\年 一月 星期三\。
5-10常规函数
这些函数可以使用任何数据类型,并且可以使用空值。 1、nvl(expr1, expr2):
如果expr1为空值,则返回expr2,否则返回expr1,例如
nvl(commission_pct, 0); 没有提成的员工,显示0 nvl(hire_date,date '1997-01-01'); 默认聘用日期
nvl(manager_id, '我就是老大'); 没有领导的人,就是老大了
2、nvl2(expr1, expr2, expr3)
如果expr1为非空则返回expr2,否则返回expr3,例如:
nvl2(commission_pct, 'sal+comm', 'comm')
//如果有提成比率,收入是工资加提成,否则只有工资。
3、nullif(A, B):
如果A和B相等,则返回空,否则返回A,例如:
nullif(length(first_name), length(last_name)) //如果名和姓的长度相等则返回空,否则返回名的长度
4、coalesce(A, B, C):
返回A、B、C中第一个不为空的值,例如:
coalesce(commission_pct, salary, 10)
这个函数可以理解成是三个参数的nvl函数。
练习-员工的当前工作
(5分钟)从员工表和岗位历史表关联查询,显示每个员工的姓氏、岗位、历史岗位(如果换过岗位则显示历史岗位,否则显示空)。
5-11 case函数
1、case表达式用来执行if-then-else的分支判断,在h2db中实现了casewhen函数。 casewhen(boolean, A, B) 如果表达式为真则返回A,否则返回B
casewhen(id=1, 'A', 'B')
2、case表达式是可以嵌套使用,比如以下语句:
select last_name,job_id,
casewhen(job_id='IT_PROG', 1.1*salary, casewhen(job_id='ST_CLERK', 1.15*salary, casewhen(job_id='SA_REP', 1.2*salary, salary)) ) revised_salary from hr.employees;
根据岗位执行不同的加薪计划。
演示-个性化加薪计划