1.时间格式化
(1) MySQL—date_format()
1.date_formate
时间格式化
年%Y
月%m ,数值(00-12)
日%d
周%u(周一是第一天) %U(周天是第一天)
%W 星期名(英文)
注意:hive中也有这个函数,但是格式略有不同,例如2020-01-01要写成‘yyyy-MM-dd’格式
(2)Oracle—to_char()
(3)SqlServer—convert()
CONVERT() 函数是把日期转换为新数据类型的通用函数。可以用不同的格式显示日期/时间数据。
语法
CONVERT(data_type(length),data_to_be_converted,style)
data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style 规定日期/时间的输出格式。
其他关于SqlServer的重要时间函数,参考博文
《SqlServer时间函数总结》
2.用于处理时间日期的函数
获取当前日期:curdate(),current_date()
获取当前时间:curtime(),current_time()
获取当前日期时间:now()
从日期中选择出月份数:month(date),monthname(date)
从日期中选择出周数:week(date) weekofyear()或者date_format(’%u’)
从日期中选择出周数:year(date)
从时间中选择出小时数:hour(time)
从时间中选择出分钟数:minute(time)
从时间中选择出今天是周几:weekday(date),dayname(date)
查看日期间隔(格式为日期或者datetime格式):datediff(大日期,小日期)
日期格式化;date_format
截取其中一部分:extradate
(1)Oracle的时间函数
select to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyyiw') as week, --oracle求当年的第几周
to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyyww') as week2, --oracle求当年的第几周
to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyy') as year, --oracle求第几年
to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyymm') as month, --oracle求当年的第几月
to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyyddd') as day, --oracle求当年的第几天
to_char(TO_DATE('20110401', 'YYYYMMDD'), 'yyyyq') as quarter -- oracle求当年的第几季度
from dual
(2)MySQL今天、昨天、上周、近30天、去年等的数据的方法
-- 今天
select * from 表名 where to_days(时间字段名) = to_days(now());
-- 昨天
SELECT * FROM 表名 WHERE TO_DAYS(NOW( ) ) - TO_DAYS( 时间字段名) <= 1
-- 7天
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <=date(时间字段名)
-- 近30天
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <=date(时间字段名)
-- 本月
SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) =DATE_FORMAT( CURDATE( ) , '%Y%m' )
-- 上一月
SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1
-- 查询本季度数据
select * from `ht_invoice_information` whereQUARTER(create_date)=QUARTER(now());
-- 查询上季度数据
select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(DATE_SUB(now(),interval 1 QUARTER));
-- 查询本年数据
select * from `ht_invoice_information` where YEAR(create_date)=YEAR(NOW());
-- 查询上年数据
select * from `ht_invoice_information` where year(create_date)=year(date_sub(now(),interval 1 year));
-- 查询当前这周的数据
SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now());
-- 查询上周的数据
SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) =YEARWEEK(now())-1;
-- 查询当前月份的数据
select name,submittime from enterprise where date_format(submittime,'%Y-%m')=date_format(now(),'%Y-%m')
-- 查询距离当前现在6个月的数据
select name,submittime from enterprise where submittime between date_sub(now(),interval 6 month) and now();
-- 查询上个月的数据
select name,submittime from enterprise where date_format(submittime,'%Y-%m')=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m')
(3)HiveSQL时间函数
可以参看博主博文《hive时间函数总结》
3.format
格式化
4.处理数值的函数
四舍五入函数:round(x,y),y代表保留小数的位数
随机数函数:rand()
数值截取函数:truncate(x,y)
绝对值函数:abs(x)
向上取整函数:ceil(x)
向下取整函数:floor(x)
取模函数:mod(x,y)
5.处理null值的函数
(1)MySQLl: IFNULL() 函数
IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
第一个参数为 NULL:
SELECT IFNULL(NULL, "RUNOOB");
以上实例输出结果为:
RUNOOB
第一个参数不为 NULL:
SELECT IFNULL("Hello", "RUNOOB");
以上实例输出结果为:
Hello
(2)oracle: nvl(x,value)和NVL2(expr1,expr2, expr3)
语法
NVL(Expression1, Expression2)
参数
Expression1, Expression2
如果 Expression1 的计算结果为 null 值,则 NVL( ) 返回 Expression2。如果 Expression1 的计算结果不是 null 值,则返回Expression1。Expression1 和 Expression2 可以是任意一种数据类型。如果 Expression1 与 Expression2 的结果皆为 null 值,则 NVL( ) 返回 .NULL.。
NVL2函数的格式如下:NVL2(expr1,expr2, expr3)
含义是:如果该函数的第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第三个参数的值
(3)SqlServer:ISNULL() 函数
适用于数字型、字符型和日期型,但是 expr1和expr2的数据类型必须为同类型。
isnull(参数1,参数2),判断参数1是否为NULL,如果是,返回参数2,否则返回参数1。
select ISNULL(null,'helloword') 返回helloword字符串
select ISNULL('','helloword')返回 空串
(4)Hive:NVL()函数
同oracle
6.upper,lower,ucase,icase大小写转换
在MySQL中,通过利用upper、lower、ucase、lacase几个函数对字符串进行大小写转换。
ucase(str)——同upper函数
lcase(str)——同lower函数
select upper('chINese'), lower('chINese'); # CHINESE chinese
select ucase('chINese'), lcase('chINese'); # CHINESE chinese
7.if
两个条件
8.case…when
多条件
9.字符串拼接函数:concat()
10.字符串切片函数
(1)mysql中left()、right()、substring()、substring_index()
四个函数的具体用法,可以参考博主博文**《Mysql字符串截取总结》**
(2)oracle中substr
substr(字符串,截取开始位置,截取长度) //返回截取的字
(3)SqlServer
(4)hive中切片函数
可以参考博主博客《Hive字符串分割切片截取函数》 和《hive字符串函数整理》
11. 字符替换:replace
举例:将某字段下的数据原格式 baidu.com.cn/qingpingyue
变为 格式qingpingyue
-- 将baidu.com.cn 替换为空
select REPLACE(字段名, 'baidu.com.cn/', '')from 表名
方式二:用substing
select SUBSTRING( 字段名, 14, 30 )from 表名
知识点一:replace()的语法
REPLACE ( string_replace1 , string_replace2 , string_replace3 )
参数解析:
string_replace1 待搜索的字符串表达式。string_replace1 可以是字符数据或二
进制数据
string_replace2 待查找的字符串表达式。string_replace2 可以是字符数据或二
进制数据。
string_replace3 替换用的字符串表达式。string_replace3 可以是字符数据或二
进制数据。
知识点二:replace()的返回值
如果参数是支持的字符数据类型之一,并且在string_replace1 中能够找到
string_replace2,那么返回替换后的字符串;反之, 返回 string_replace1;
如果参数是支持的 binary 数据类型之一,则返回二进制数据。
注意:oracle和hive中可以使用regexp_replace()进行字符替换
-- 将表中时间字段中2019/01/04格式转换为 2019-01-04
hive> select regexp_replace(时间字段名, '/', '-') from 表名;
此时2019/01/04格式会转换为 2019-01-04格式
1,字符串类型参数:
SELECT REPLACE('abcdefg bcd','bcd','xxx')
结果为:axxxefg xxx
2,二进制类型参数:
SELECT REPLACE(100111001101,111,000)
结果为:1000001101
总结:
replace(str1,str2,str3)
说明:str3替换str1中出现的所有str2,返回新的字符串,如果有某个参数为NULL,此函数返回NULL
该函数可以多次替换,只要str1中还有str2存在,最后都被替换成str3 若str3为空,则删除str2
12.floor
MySQL FLOOR(x) 函数返回小于 x 的最大整数值。
【实例】求 小于 5,5.66,-4,-4.66 的最大整数
mysql> SELECT FLOOR(5),FLOOR(5.66),FLOOR(-4),FLOOR(-4.66);
+----------+-------------+-----------+--------------+
| FLOOR(5) | FLOOR(5.66) | FLOOR(-4) | FLOOR(-4.66) |
+----------+-------------+-----------+--------------+
| 5 | 5 | -4 | -5 |
+----------+-------------+-----------+--------------+
1 row in set (0.00 sec)
由运行结果可知,小于 5,5.66,-4,-4.66 的最大整数依次是 5,5,-4,-5。