Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SQL Server生成随机日期模拟测试数据的需求

SQL Server生成随机日期模拟测试数据的需求

作者头像
bisal
发布于 2022-01-25 05:29:21
发布于 2022-01-25 05:29:21
2K00
代码可运行
举报
运行总次数:0
代码可运行

最近碰到个SQL Server跑SQL的性能问题,同样是关系型数据库,因此在原理层面,不同数据库之间有些内容是可以借鉴的,但是SQL Server一些细节上和操作层面,略有不同,需要熟悉和积累。

为了模拟,要插入一些测试数据,特别地需要一个存储日期(要求的格式:yyyymmdd)的字符串类型字段。我用的如下操作方式,可能有些绕,如果各位朋友有更好的方案,可以提出来,一起学习下。

1. 创建一张测试表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table t1(id int identity(1,1) primary key, c1 varchar(10));

2. 插入10000条测试数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into t1 default values
go 10000

两点要注意,

(1) go语法在DBeaver提示错误,可以在SQL Server Management Studio中执行。

(2) "go 10000"不能带";"。

此时t1中id字段由于设置了idntitiy,会得到从1到10000的值,但是c1字段为空,由于测试需求,需要让c1字段存储"yyyymmdd"的日期数值。

3. 生成随机日期的数据中间表

SQL Server生成随机数可以用函数rand(),例如,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select cast(rand()*1000 as int);

如果生成随机的日期,找了一种方式,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare @bdate date, @edate date
set @bdate = '20210101'
set @edate = '20210601'
select id, random_date = convert(varchar(10), dateadd(day, abs(checksum(newid())))%datediff(day, @bdate, @edate), @bdate), 112)
into t2 from t1;

其中几个知识点,

(1) @bdate和@edate是生成随机日期的上下限。

(2) dateidff函数用来获取日期/时间差,入参是三个,(datepart, startdate, enddate),其中datepart表示返回两个指定日期(startdate和enddate)之间所跨的日期或时间边界的数目,此处用的day,是按照天,还可以改成second按照秒计算等。

(3) checksum()函数返回按照表的某一行或一组表达式计算出来的校验和值,他可以将文本改为一串数字。

(4) newid()返回一个新的GUID号码,永远不会重复,而且毫无规律。

(5) dateadd函数顾名思义,将一个时间间隔和指定date的指定datepart相加,返回一个新的datetime值,入参是三个,(datepart, number, date)。

(6) convert函数,这个有点意思,返回各种格式的日期字符串,如下所示,我们要的是"yyyymmdd",因此值是112,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06
Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16
Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06
Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06
Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06
Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06
Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06
Select CONVERT(varchar(100), GETDATE(),: 10:57:46
Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM
Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06
Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16
Select CONVERT(varchar(100), GETDATE(), 12): 060516
Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937
Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967
Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47
Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157
Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM
Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16
Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250
Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM
Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006
Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16
Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006
Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006
Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006
Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006
Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006
Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM
Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006
Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16
Select CONVERT(varchar(100), GETDATE(), 112): 20060516
Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513
Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547
Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49
Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700
Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827:
Select CONVERT(varchar(100), GETDATE(), 131): 18/04/1427 10:57:49:920AM

通过以上函数,就可生成一个随机的日期字符串,"select ... into t2 from t1"则从t1表取出所有的记录(10000条),包括了自增的主键字段id,以及每行随机生成的日期字符串c1,插入到t2,字段名称是id和random_date。

4. 关联更新t1

其实到第三步,t2表的记录已经包含了数值字段id以及随机日期字符串字段c1,满足测试要求了,如果非得用t1,可以再更新下,关联t2,更新t1,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
update t1 set t1 = t2.random_date
  from t1, t2
 where t1.id = t2.id;

其实很多函数,从名称上,在各种开发语言和数据库中都见过,因此很多技术上的知识都是相通的,做到举一反三、融会贯通,才可以慢慢提高自己的水平。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/01/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
T-SQL取时间的不同方法
超级实用的T-SQL取时间的不同方法 CONVERT(nvarchar(10),count_time,121): CONVERT为日期转换函数,一般就是在时间类型 (datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar)相互转换的时候才用到的函数的3个参数,第1个参数为,转换后的大小,第2个为转换日期的字段或函数,第3个为转换的格式,具体如下: 0 | 0 or 100 | mon dd yyyy hh:miAM(或PM) 1 | 101 |
用户1719978
2018/07/05
5990
SQL Server-命令速查-CheatSheet
然后字符串部分可以写各种格式## String Replace 以下示例使用 xxx 替换 abcdefghi 中的字符串 cde。
szhshp
2022/08/15
9590
SQL基础用法(实例一)
1 /* 2 3 4 2006年10月01日 5 6 SQL Server 数据库的基本操作 7 (1) 数据库的创建 8 (2) 数据表的创建以及相关约束的指定(含临时表) 9 (3) 数据的添/删/改 10 (4) 数据的查询 11 12 */ 13 14 (0)创建数据库 15 -- 指定数据库名称 16 -- (注:如果数据库名中包含空格可以使用[]将其标示) 17 create database [Super WC] 18 -- 关于
用户1112962
2018/07/03
9530
教你用SQL生成一张带「农历」的日期维度表
农历与世界通用的日历有所区别,是科学家演算出来的,目前为止只有到2049年的,以后的有了还可以加入!
SQL数据库开发
2024/04/25
2540
教你用SQL生成一张带「农历」的日期维度表
C#三十四 常用开发的部分总结
如果为了实现数据库操作类DbHelperSQL能同一项目支持多个数据库访问的情况,则可以保留原来带有的连接字符串参数的方法,实现方法的重载。例如:
用户9184480
2024/12/13
580
sql 时间转字符串_字符串举例
Select CONVERT(varchar(100), GETDATE(), 0): 05 20 2021 3:47PM Select CONVERT(varchar(100), GETDATE(), 1): 05/20/21 Select CONVERT(varchar(100), GETDATE(), 2): 21.05.20 Select CONVERT(varchar(100), GETDATE(), 3): 20/05/21 Select CONVERT(varchar(100), GETDATE(), 4): 20.05.21 Select CONVERT(varchar(100), GETDATE(), 5): 20-05-21 Select CONVERT(varchar(100), GETDATE(), 6): 20 05 21 Select CONVERT(varchar(100), GETDATE(), 7): 05 20, 21 Select CONVERT(varchar(100), GETDATE(), 8): 15:47:31 Select CONVERT(varchar(100), GETDATE(), 9): 05 20 2021 3:47:31:410PM Select CONVERT(varchar(100), GETDATE(), 10): 05-20-21 Select CONVERT(varchar(100), GETDATE(), 11): 21/05/20 Select CONVERT(varchar(100), GETDATE(), 12): 210520 Select CONVERT(varchar(100), GETDATE(), 13):20 05 2021 15:47:31:410 Select CONVERT(varchar(100), GETDATE(), 14): 15:47:31:410 Select CONVERT(varchar(100), GETDATE(), 20):2006-05-16 10:57:47 Select CONVERT(varchar(100), GETDATE(), 21):2021-05-20 15:47:31.410 Select CONVERT(varchar(100), GETDATE(), 22): 05/20/21 3:47:31 PM Select CONVERT(varchar(100), GETDATE(), 23): 2021-05-20 Select CONVERT(varchar(100), GETDATE(), 24): 15:47:31 Select CONVERT(varchar(100), GETDATE(), 25): 2021-05-20 15:47:31.410 Select CONVERT(varchar(100), GETDATE(), 100): 05 20 2021 3:47PM Select CONVERT(varchar(100), GETDATE(), 101): 05/20/2021 Select CONVERT(varchar(100), GETDATE(), 102): 2021.05.20 Select CONVERT(varchar(100), GETDATE(), 103): 20/05/2021 Select CONVERT(varchar(100), GETDATE(), 104): 20.05.2021 Select CONVERT(varchar(100), GETDATE(), 105):20-05-2021 Select CONVERT(varchar(100), GETDATE(), 106):20 05 2021 Select CONVERT(varchar(100), GETDATE(), 107): 05 20, 2021 Select CONVERT(varchar(100), GETDATE(), 108): 15:47:31 Select CONVERT(varchar(100), GETDATE(), 109): 05 20 2021 3:47:31:410PM Select CONVERT(varchar(100), GETDATE(), 110): 05-20-2021 Select CONVERT(varchar(100), GETDATE(), 111): 2021/05/20 Select CONVERT(varchar(100), GETDATE(), 112): 20210520 Select CONVERT(varchar(100), GETDATE(),
全栈程序员站长
2022/11/10
1.6K0
sql 时间转字符串_字符串举例
SQL语句来查询今天、昨天、7天内、30天的数据
SQL语句来查询今天、昨天、7天内、30天的数据! 今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0 昨天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=1 7天内的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())<=7 30天内的所有数据:select
小语雀网
2022/05/06
2.5K0
sql 时间总结
(本贴是从网上找了几个比较好的帖子总合了一下并做了一下修改) 下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。 日期部分 缩写  year yy, yyyy  quarter qq, q  Month mm, m  dayofyear dy, y  Day dd, d  Week wk, ww  Hour hh  minute mi, n  second ss, s  millisecond ms  SELECT DATEPART(dy, @DATE) AS DayOfY
lpxxn
2018/01/31
1.9K0
你真的会玩SQL吗?实用函数方法汇总
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接、外连接 你真的会玩SQL吗?三范式、数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节点的方法 你真的会玩SQL吗?让人晕头转向的三值逻辑 你真的会玩SQL吗?EXISTS和IN之间的区别 你真的会玩SQL吗?无处不在的子查询 你真的会玩SQL吗?Case也疯狂 你真的会玩SQL吗?表表达式,排名函数 你真的会玩SQL吗?简单的 数据修改 你真的会玩SQL吗?你所不知道的 数据聚合 你真的会玩S
欢醉
2018/01/22
1.4K0
常用日期计算SQL语句
-- 本月的第一天 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) -- 本月的最后一天 SELECT DATEADD(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) -- 上个月的第一天 SELECT DATEADD(m,-1, DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) -- 上个月的最后一天 SELECT DATEADD(ms,-3,DATEADD(m
挽风
2021/04/13
1.1K0
sql分别用日期、月、年 分组 group by 分组,datepart函数,datediff函数 统计
–以2013-12-10 12:56:55为例 –print convert(nvarchar(10),getdate(),120) => 2013-12-10
全栈程序员站长
2022/09/01
2.7K0
sql分别用日期、月、年 分组 group by 分组,datepart函数,datediff函数 统计
sql server中部分函数功能详解
我们希望从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人:
寻找石头鱼
2019/09/11
1.6K0
SQL Server 的时间函数
2、dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值,例如:向日期加上2天
浩Coding
2019/07/03
2.9K0
经典SQL自定义函数
实现原理:先利用DATEDIFF取得当前月的第一天,再将月份加一取得下月第一天,然后减去1分钟,再取日期的
Java架构师必看
2021/03/22
4550
求本年、本月、本周等数据
本文转载:http://www.cnblogs.com/ethan-qi/archive/2013/05/14/3077371.html
跟着阿笨一起玩NET
2018/09/19
5040
那些年我们写过的T-SQL(上篇)
在当今这个多种不同数据库混用,各种不同语言不同框架融合的年代(一切为了降低成本并高效的提供服务),知识点多如牛毛。虽然大部分SQL脚本可以使用标准SQL来写,但在实际中,效率就是一切,因而每种不同厂商的SQL新特性有时还是会用到,这部分内容更是让人抓瞎,常常会由于一些很简单的问题花很久来搜索准确答案。赶脚俺弱小的智力已经完全无法记清楚常见的命令了,即使是用的最熟悉的T-SQL(SQL Server)。因此将最常见的T-SQL操作做个简单的总结,包括一些容易忽视的知识点和常见的开发样例。实话实说,现在开发中较
用户1216676
2018/01/24
3.2K0
那些年我们写过的T-SQL(上篇)
SQL基础日期函数
1 --dateadd 将制定的数值添加到指定的日期部分后的日期 select dateadd(mm,4,'01/01/99') 2 -- 返回:以当前的日期格式返回05/01/99 3 4 --datediff 二个日期之间的指定日期部分的区别 select datediff(mm,'01/01/99','05/01/99') 5 --返回:4 6 7 --datename 日期中指定日期部分的字符串形式 select datename(dw,'01/01/2000')
用户1112962
2018/07/04
2.1K0
SqlServer日期时间函数
datediff(day,createdate,GetDate())=0 -- 判断是否当天,createdate为日期字段 -- ╔════════════════════╗ -- ====================================================
莫问今朝
2019/07/11
1.7K0
T-SQL 时间操作(dateadd ,datediff ,datepart ,datename )
--1. 当前系统日期、时间 select getdate() --2015-01-06 09:27:27.277 --2.时间操作 dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值 dateadd(datepart,number,date) 注: datepart : year(yy, yyyy) | quarter(qq,q) | month(mm,m) | week(ww,wk) | day(dd,dy) | hour(h) | mi
好派笔记
2021/11/01
1.1K0
数据库干货:整理SQLServer非常实用的脚本
今天给大家分享自己在工作当中用到的SQLServer一些常用的脚本,希望能对大家有所帮助!
小明互联网技术分享社区
2021/02/25
3550
数据库干货:整理SQLServer非常实用的脚本
相关推荐
T-SQL取时间的不同方法
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文