SQL指标计算常用函数(时间函数是是重点!!)

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 则返回第一个参数的值。

第一个参数为 NULLSELECT IFNULL(NULL, "RUNOOB");
以上实例输出结果为:
RUNOOB

第一个参数不为 NULLSELECT 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,否则返回参数1select 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。

发布了388 篇原创文章 · 获赞 71 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/ZZQHELLO2018/article/details/102985115