我与旧事归于尽,来年依旧迎花开。
剑谱最终页,无爱即是神。
岁末将至,祝我得偿所愿,平安喜乐!
描述:
今天在整理日志的时候 突然发现时间过得好快,一转眼的功夫,2021年已经从年前到了年尾,而口罩也是始终如一的带着,丝毫不敢懈怠~(积极响应国家号召,感慨疫情对人们的生活造成诸多不便......),突然想到mysql sqlserver oracle 自己遇到的一些语法上的区分,避免小伙伴跟我一样,踩着百度链接一步一个坑的走过来,噗哈哈哈~新年快乐
过了今天 以后的 sj;sysdate;current_date都是2022啦
一、获取系统时间
MYSQL
select now()
select SYSDATE()
select CURRENT_DATE
select CURRENT_TIME
SQL Server
select getdate()
Oracle
select sysdate from dual; -- 31-12月-21
二、格式化
MYSQL
select year(now()) -- 2021
select month(now()) -- 12
select day(now()) -- 31
select hour(now()) -- 21
select MINUTE(now()) -- 18
select second(now()) -- 58
SQL Server
CONVERT() 函数可以用不同的格式显示日期/时间数据
select convert(varchar(100) ,'yyyy-mm-dd') from ODS_NC_sales_Slip
select convert(varchar(100), getdate(), 20) -- 2021-12-01 15:21:00
select convert(varchar(100), getdate(), 21) -- 2021-12-01 15:21:10.073
select convert(varchar(100), getdate(), 22) -- 12/01/21 3:19:53 PM
select convert(varchar(100), getdate(), 23) -- 2021-12-01
select convert(varchar(100), getdate(), 24) -- 15:20:24
select convert(varchar(100), getdate(), 25) -- 2021-12-01 15:21:23.847
Oracle
select to_char(sysdate,'yyyy-mm-dd hh24:mi') from dual; -- 2021-12-31 21:59
select to_char(sysdate, 'yyyy' ) from dual; --年 -- 2021
select to_char(sysdate, 'MM' ) from dual; --月 -- 12
select to_char(sysdate, 'dd' ) from dual; --日 -- 31
select to_char(sysdate, 'Q') from dual; --季 -- 4
select to_char(sysdate, 'iw') from dual; --周 --52 按日历上的那种,每年有52或者53周当前时间减去7天的时间
select sysdate - interval '7' day from dual; -- 24-12月-21
当前时间减去7月的时间
select sysdate,sysdate - interval '7' month from dual; -- 31-12月-21 31-5月 -21
三、同比、环比
在做这道题的时候 需要弄清楚几个名词
环比
是指本期与上期数据之间的比率。计算公式为:本期数/上期数✖100%。
环比增长率
是指本期与上期数据之间的增长比率。计算公式为:(本期数-上期数)/上期数×100%。
同比
是把当年每月与上一年相应月份的数据相除计算出的一个比率。即某年第 n 月与上一年第 n 月的比值,计算公式为:本期/同期*100%。
同比增长率
是指和去年同期相比较的增长率,即某年第n月与上一年第n月相比较的增长率,计算公式为:(本期-同期)/同期*100%。
SQL的不同 可能语法上有细微的差距 但是思路都是一样的 自己也只做过SQLite的同环比 其他三个并没有实际操作
MYSQL
SQL Server
Oracle
SQLite
select t.m,t.ym,
t.销量,
t1.销量 同期,
(case when t1.销量 is null then ''
else (t.销量-t1.销量)/t1.销量 end) 同比,
t2.销量 上期,
(case when t2.销量 is null then ''
else (t.销量-t2.销量)/t2.销量 end) 环比
from
(
select strftime('%m',b.订购日期)+0 m,
strftime('%Y-%m',b.订购日期) ym,
sum(a.数量) 销量
from 订单明细 a
left join 订单 b on a.订单ID=b.订单ID
where strftime('%Y',b.订购日期) = '1997'
group by strftime('%Y-%m',b.订购日期)
) t -- 1997年 m月份 ym年月 销量 销售额
left join
(
select strftime('%m',b.订购日期)+0 m,
strftime('%Y-%m',b.订购日期) ym,
sum(a.数量) 销量
from 订单明细 a
left join 订单 b on a.订单ID=b.订单ID
where strftime('%Y',b.订购日期) = '1996'
group by strftime('%Y-%m',b.订购日期)
) t1 on t.m=t1.m -- 1996 年 m月份 ym年月 销量 销售额
left join
(
select (case when strftime('%m',b.订购日期)+0 <=11
then strftime('%m',b.订购日期)+1 end) m, -- 1997年 使用then判断 ym中月份小于等于11 将月份+1
strftime('%Y-%m',b.订购日期) ym,
sum(a.数量) 销量
from 订单明细 a
left join 订单 b on a.订单ID=b.订单ID
where strftime('%Y',b.订购日期) = '1997'
group by strftime('%Y-%m',b.订购日期)
union
select (case when strftime('%m',b.订购日期)+0 =12
then 1 end) m,
strftime('%Y-%m',b.订购日期) ym,
sum(a.数量) 销量
from 订单明细 a
left join 订单 b on a.订单ID=b.订单ID
where strftime('%Y',b.订购日期) = '1996'
group by strftime('%Y-%m',b.订购日期)
) t2 on t.m=t2.m
四、截取字符串
MYSQL
函数 | 作用 |
SUBSTR(str FROM pos FOR len) | 截取字段value,从第pos位开始截取,截取len位 |
SUBSTR(str FROM pos) | 截取字段value,从第pos位开始截取,截取到最后一位 |
SUBSTR(str,pos) | 将str字段截取 索引从1开始计算 从pos开始截取 直到最后 |
SUBSTR(str,pos,len) | 将str字段截取 索引从pos开始计算 截取长度为len |
SUBDATE(date,INTERVAL expr unit) | 在下面六、日期计算 有详细解释 |
SUBDATE(expr,days) | 在下面六、日期计算 有详细解释 |
SUBTIME(expr1,expr2) | 在下面六、日期计算 有详细解释 |
substring函数 | |
SUBSTRING(str FROM pos FOR len) | 截取字段dua,从第pos位开始截取,截取len位 |
SUBSTRING(str FROM pos) | 截取字段dua,索引从1开始计算,从pos开始截取 直到最后 |
SUBSTRING(str,pos) | 同SUBSTRING(str FROM pos)函数 |
SUBSTRING(str,pos,len) | 同SUBSTRING(str FROM pos FOR len)函数 |
SUBSTRING_INDEX(str,delim,count) | 将str字符串,按照delim的格式进行分割,然后按照分割后计数的方式截取。count的为正数从左到右截取,count为负数从右到左截取,count为0,结果集为空。 |
select
SUBSTR(td1.value from 1 for 2)
from
(select concat('123','456') value) td1select
SUBSTR(td1.value from 2)
from
(select concat('123','456') value) td1
select
substr(td1.dua,2,3),
substr(td1.dua,2)
from
(select concat('123','456') dua) td1
substring函数
select
SUBSTRING(td1.dua from 2 for 3)
from
(select concat('123','456') dua) td1
select
SUBSTRING(td1.dua from 2)
from
(select concat('123','456') dua) td1
select
SUBSTRING(td1.dua , 2),
SUBSTRING(td1.dua , 2,3)
from
(select concat('123','456') dua) td1
select
SUBSTRING_INDEX('www.kugou.com','.',-4) 负四,
SUBSTRING_INDEX('www.kugou.com','.',-3) 负三,
SUBSTRING_INDEX('www.kugou.com','.',-2) 负二,
SUBSTRING_INDEX('www.kugou.com','.',-1) 负一,
SUBSTRING_INDEX('www.kugou.com','.',0) 零,
SUBSTRING_INDEX('www.kugou.com','.',1) 一,
SUBSTRING_INDEX('www.kugou.com','.',2) 二,
SUBSTRING_INDEX('www.kugou.com','.',3) 三,
SUBSTRING_INDEX('www.kugou.com','.',4) 四;
总结:大致可分为三类 一类是substr(str1,str2)两个参数截取str1,截取到str2的位置、一类是substring(str1,str2,str3)三个参数的截取str1,从str2截取到str3的位置、最后一类是substring_index(str1,str2,str3)按照指定格式进行截取 截取str1 按照str2的格式 截取第几个str3的位置
SQL Server
函数 | 作用 |
SUBSTRING(expression, start, length) | 截取expression,开始位置是start,截取长度为lenth |
LEFT(character_expression, integer_expression) | 从左边开始截取 character_expression 截取长度为 integer_expression |
RIGHT(character_expression, integer_expression) | 从右边开始截取 character_expression 截取长度为 integer_expression |
CHARINDEX(expression1, expression2 [,start_location]) | 查找expression1(子),在expression2(父)中查找expression1(子)的位置,经测试 默认是从1开始计算,负数意义不大,返回值是子在父中所占的位置,如果没有,返回0。 |
select
left(td1.dua,3)
from
(select '123' + '456' as dua) td1
select
right(td1.dua,3)
from
(select '123' + '456' as dua) td1
select
SUBSTRING(td1.dua, 1, 3)
from
(select '123' + '456' as dua) td1
select
charindex('2','123456',-2) 负二,
charindex('2','123456',-1) 负一,
charindex('2','123456',0) 零,
charindex('2','123456',1) 一,
charindex('2','123456',2) 二,
charindex('2','123456',3) 三,
charindex('2','123456',4) 四;
Oracle
SQLite
函数:substr(string string,num start,num length)
用法:
string为字符串;
start为起始位置;字符串的第一个字符的位置为1,不是从0开始计算
length为长度
五、拼接字符串
MYSQL
select concat(str1,str2)
select concat('123','456')
SQL Server
select '123' + '456'
Oracle
六、日期计算
MYSQL
SQL Server
Oracle
SQLite
DATEDIFF ( datepart , startdate , enddate ) -- 用 enddate 减去 startdate
七、类型转换
MYSQL
SQL Server
SQL Server 采用convert(varchr,'')用法
Oracle
Oracle 采用to_char用法
八、将多列合并一列
MYSQL
select concat(str1,str2,str3) from 表 -- 可带多个参数
SQL Server
Oracle
select concat(str1,str2) from 表 -- concat只能带两个参数
select str1||str2||str3 from 表 -- || 可以多个拼接
以上零零散散都是自己在工作中遇到过的 自己经常忘 混淆 这里做一下知识整理总结 当然还有很多自己没有遇到过的 感觉挺有意思的 跟同事调侃到“为啥不出来一个牛皮的大佬组织啥的将SQL语法统一的玩笑话”"都一样怎么体现出与众不同呢" 其实很多地方也都是相通的知识部分语法 函数不同 像select group by where 都是通用系列 好啦 时间关系 今天先记录到这里
下次在家!!!