我与旧事归于尽,来年依旧迎花开~

这篇博客主要总结了MySQL、SQL Server和Oracle数据库中获取系统时间、时间格式化、同比环比计算、字符串截取及拼接的方法,包括各自语法的差异和示例。同时,博主分享了在工作中遇到的SQL知识混淆问题,提出统一SQL语法的设想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我与旧事归于尽,来年依旧迎花开。

剑谱最终页,无爱即是神。

岁末将至,祝我得偿所愿,平安喜乐!

描述:

今天在整理日志的时候 突然发现时间过得好快,一转眼的功夫,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

  SQLite – Java | 菜鸟教程

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) td1

select 
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 都是通用系列 好啦 时间关系 今天先记录到这里

下次在家!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妙趣生花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值