目录
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 类型,都会精确到多位小数。但有时候 我们不需要那么精确,例如,只精确到两位有效数字。
解决:
-
使用 Round() 函数,如 Round(@num,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)
执行结果,如下: