sql--SQL Server--常用sql语句(项目用到的sql) 持续更新中。。。。。。。

目录

6.查询最近7天内(相隔7天内)的数据 ( 扩展:查询今天、昨天、今天和昨天、7天内、30天 )

5.SQL 小技巧(重复、替换、截取、去空格、去小数点后的位数)

4.Sql Server 保留几位小数的三种做法(转载)

3.sql–一个列有几种类型,分别计算各类型条数

2.将某列设置为自增长

1.只修改日期,但是不改变时间(修改日期 ‘2020-01-11’ , 但是不改变时间 ’ 10:17:33.000’)

.
.
.

7.



6.查询最近7天内(相隔7天内)的数据 ( 扩展:查询今天、昨天、7天内、30天 )

网上搜索结果如下: ( 并不是想要的数据 )
执行了,结果不是自己想要的,把相隔超过7天的数据也查询出来了,一开始还以为自己写错了,结果是因为DateDiff函数计算结果出现 负数 导致的。(因为数据库里的数据是我模拟的假数据,日期 有 超过 当前电脑时间2020-02-04 的数据存在)

6.1改进版,结果正确

----查询7天内的所有数据
select id,positivezygdl,creationtime, DateDiff(DD,creationtime,getdate()) as '相隔天数'  
from tb_monthlyammeter 
 where DateDiff(dd,creationtime,getdate())<=7  and DateDiff(dd,creationtime,getdate())>=0 

在这里插入图片描述

6.2网络搜索,原版

--查询7天内的所有数据:
select * from 表名 where DateDiff(dd,datetime类型字段,getdate())<=7

执行结果错误,将相隔7天 以外 的数据也查询出来了。

在这里插入图片描述

6.3 扩展:Sql Server日期查询-SQL查询今天、昨天、今天和昨天、7天内、30天

以下,部分为网络搜索结果:

注意:DateDiff() 函数返回两个日期之间的差值(差值可以为正数 ,0,负数)

第一个参数(参数1):两个日期的差, 将年 或 月 或日,部分相减 得到的 差。
第二个参数(参数2):相当于 被减数
第三个参数(参数3):相当于 减数

例如:

SELECT DATEDIFF(day,'2008-12-29','2008-12-30') AS DiffDate     结果为 1
SELECT DATEDIFF(day,'2008-12-29','2008-12-28') AS DiffDate     结果为 -1
SELECT DATEDIFF(day,'2008-12-29 11:52','2008-12-28 15:23') AS DiffDate     结果为 0
SELECT DATEDIFF(day,'2008-12-29 11:52','2008-12-30 15:23') AS DiffDate     结果为 1
SELECT DATEDIFF(day,'2008-12-29 11:52','2008-12-28 15:23') AS DiffDate     结果为 -1

在这里插入图片描述

今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0
昨天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=1
今天和昨天 , 两天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate()) in(0 ,1)

7天内的所有数据: select * from 表名 where DateDiff(dd,datetime类型字段,getdate())<=7

30天内的所有数据: select * from 表名 where DateDiff(dd,datetime类型字段,getdate())<=30
本月的所有数据: select * from 表名 where DateDiff(mm,datetime类型字段,getdate())=0
本年的所有数据: select * from 表名 where DateDiff(yy,datetime类型字段,getdate())=0

查询今天是今年的第几天: select datepart(dayofyear,getDate())
查询今天是本月的第几天:1. select datepart(dd, getDate())
. … . . . . . . . . . . . . . . . . … 2.select day(getDate())

查询本周的星期一日期是多少 (注意:指定日期不能是周日,如果是周日会计算到下周一去。所以如果是周日要减一天) SELECT DATEADD(wk,DATEDIFF(wk,0,getdate()),0)

查询昨天日期:select convert(char,dateadd(DD,-1,getdate()),111) //111是样式号,(100-114)

查询本月第一天日期:Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) as firstday
查询本月最后一天日期:Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) as lastday //修改-3的值会有相应的变化

本月有多少天:select datepart(dd,dateadd(dd,-1,dateadd(mm,1,cast((cast(year(getdate()) as varchar)+’-’+cast(month(getdate()) as varchar)+’-01’ ) as datetime ))))

求两个时间段相差几天:select datediff(day,‘2012/8/1’,‘2012/8/20’) as daysum
在指定的日期上±N天:select convert(char,dateadd(dd,1,‘2012/8/20’),111) as riqi //输出2012/8/21
在指定的日期上±N分钟:select dateadd(mi,-15,getdate()) //查询当前时间15分钟之前的日期​

参考:https://www.cnblogs.com/suruozhong/p/5974595.html
https://www.w3school.com.cn/sql/func_datediff.asp



5.SQL 小技巧(重复、替换、截取、去空格、去小数点后的位数)

/---------------------------重复--------------------------------/

--重复字符串 返回【abc#abc#abc#】
select replicate('abc#', 3);

/---------------------------替换--------------------------------/

--替换字符串 将e替换成E 返回【abcEdEf】
--replace('字符串', '替换前的文字', '替换后的文字')
select replace('abcedef', 'e', 'E');


--指定位置替换字符串  返回【heABCworld】
--stuff('字符串', 从哪里开始替换, 替换几位, '要替换的字符')
select stuff('hello world', 3, 4, 'ABC');

/----------------------------截取--------------------------------/

--截取字符串 返回【a    ,ab    ,Wrold】
--subString('字符串', 从哪里开始截取, 截取几位)
select subString('abc', 1, 1), subString('abc', 1, 2), subString('hello Wrold', 7, 5);


--取左边字符串  返回【left,leftStr】
--left('字符串', 从左边开始取几位)
select left('leftString', 4);
select left('leftString', 7);


--取右边字符串  返回【String,ing】
--right('字符串', 从右边开始取几位)
select right('leftString', 6);
select right('leftString', 3);

/---------------------------去空格----------------------------------/

--去掉左边空格
select ltrim(' abc'), ltrim('# abc#'), ltrim('  abc');

--去掉右边空格
select rtrim(' abc    '), rtrim('# abc#   '), rtrim('abc');

/-------------------------去小数点后的位数----------------------------/

--用函数ROUND(数值,s) ,其中s 表示小数位数
Select ROUND(4.994,2) --返回4.990


--用函数CAST(数值as numeric(n,s)),其中n表示有效数字位数,s表示小数位数
Select CAST(4.994 as numeric(10,2))--搜索返回4.99


--用函数CONVERT(numeric(n,s),数值),其中n表示有效数字位数,s表示小数位数
Select CONVERT(numeric(10,2),4.9852222)-- 返回4.99

原文:http://www.accessoft.com/article-show.asp?id=17955

.
.

4.Sql Server 保留几位小数的三种做法(转载)

问题:

数据库里的 float momey 类型,都会精确到多位小数。但有时候 我们不需要那么精确,例如,只精确到两位有效数字。

解决:

  1. 使用 Round() 函数,如 Round(@num,2) 参数 2 表示 保留两位有效数字。

  2. (未成功)更好的方法是使用 Convert(,@num) 实现转换,decimal(18,2) 指定要保留的有效数字。

这两个方法有一点不同:使用 Round() 函数,如果 @num 是常数,如 Round(2.3344,2) 则 会在把有效数字后面的 变为0 ,成 2.3300。但 Convert() 函数就不会。------------没有试成功 sql server

3.使用cast(@num as decimal(18,2))可以实现,例如cast(12 as decimal(18,2)) 结果是12.00

原文链接:https://blog.csdn.net/FelixT666/article/details/48173925

https://www.cnblogs.com/LoveQin/p/5334159.html添加链接描述

546546546544多个
.
.

3.sql–一个列有几种类型,分别计算各类型条数

SQL统计一个列中不同值的数量,并且根据这个数量的排序做一些额外的处理

在这里插入图片描述
在这里插入图片描述

--获取不同类型设备的数量
--写法1:
SELECT energytype,count(energytype)typenumber FROM tb_device GROUP BY energytype 
--写法2:
SELECT energytype,count(*)typenumber FROM tb_device GROUP BY energytype 

--带排序的:
SELECT energytype,count(energytype)typenumber FROM tb_device GROUP BY energytype 
ORDER BY typenumber desc

参考于 https://blog.csdn.net/suhiymof/article/details/81221286
. . . . . https://blog.csdn.net/weixin_42467211/article/details/84345261
.
.
.

2.将某列设置为自增长

sqlserver数据库,如果建表的时候不设列 自增,之后(使用SQL语句)没法直接修改的,需要先删再重设:

PS:如果已经建好表,可以手动修改ID列 自增长,不要使用SQL语句进行修改

alter table USERINFO drop column ID

alter table USERINFO add ID int identity(1,1)

在这里插入图片描述

手动修改ID列 自增长在这里插入图片描述

1.只修改日期,但是不改变时间(修改日期 ‘2020-01-11’ , 但是不改变时间 ’ 10:17:33.000’)

1.1方法一,使用dateadd+datediff

使用dateadd+datediff方法,可以修改 年、年月、年月日、年月日小时,或者只修改某年(其他不变,只变年的部分) 某月 某天

原始数据:
在这里插入图片描述
表结构:
在这里插入图片描述

只修改年月日,不修改小时分钟秒

--只修改年月日的部分,日的上级年月,默认一起修改
--注意:这里虽然设置新日期为 2023-03-05,但是我们设置了 D,表示修改年月日,剩余部分不管什么值,都不会被修改

UPDATE [USERINFO] SET [creationTime] = DATEADD(D, DATEDIFF(D, CREATIONTIME , '2023-03-05') ,CREATIONTIME)  

在这里插入图片描述

--只修改年月日的部分,日的上级年月,默认一起修改
--注意:这里虽然设置新日期为 2050-09-13 13:13:13,但是我们设置了 D,表示修改年月日,剩余部分不管什么值,都不会被修改

UPDATE [USERINFO] SET [creationTime] = DATEADD(D, DATEDIFF(D, CREATIONTIME , '2050-09-13 13:13:13') ,CREATIONTIME)  

在这里插入图片描述https://www.w3school.com.cn/sql/func_convert.asp
在这里插入图片描述

只修改年月

虽然是只修改年月,但还是加了日,因为如果要是 ‘2021-03’,执行sql语句时会报错。

--只修改年月的部分,月的上一级年,默认一起修改
--注意:这里虽然设置新日期为 2021-03-01,但是我们设置了 M,表示年月修改部分,所有日部分不管什么值,都不会被修改

UPDATE [USERINFO] SET [creationTime] = DATEADD(M, DATEDIFF(M, CREATIONTIME , '2021-03-01') ,CREATIONTIME)  

执行结果:
在这里插入图片描述

方法二,使用substring + convert

–sql server 修改日期 ‘2020-01-11’ , 但是不改变时间 ’ 10:17:33.000’
–整个表的时间修改 update USERINFO set sdate = ‘时间’+substring(convert(char(20),sdate,120),11,9)
–修改时间大于当前时间的日期,要改成前一天。

update USERINFO 
set creationTime = '2020-01-11' + substring(convert(char(20),creationTime,120),11,9) 
where creationTime < GETDATE()

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

1. 拓展

--修改datetime类型的数据 ,只修改日期,,,小时等设为00:00:00.000
update USERINFO set creationTime=CONVERT(datetime,'2020-02-06',101) 

在这里插入图片描述
在这里插入图片描述执行结果,如下:
在这里插入图片描述
在这里插入图片描述

发布了36 篇原创文章 · 获赞 10 · 访问量 2821

猜你喜欢

转载自blog.csdn.net/VIP_CR/article/details/103933215