MySQL 日期函数、时间函数在实际场景中的应用

整理日常业务中用到日期函数的一些场景,并对日期函数按照使用类型做了分类,实例也尽可能符合日常需求。为了方便查阅,可以先看目录,再根据需要看具体方法和实例。
首先明确日期和时间类型有哪些,也就是日期函数括号中的变量类型。

一、日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

类型 格式 描述
DATE YYYY-MM-DD 日期值
TIME HH:MM:SS 时间值或持续时间
YEAR YYYY 年份值
DATETIME YYYY-MM-DD hh:mm:ss 混合日期和时间值
TIMESTAMP YYYY-MM-DD hh:mm:ss 混合日期和时间值,时间戳

二、具体方法

(1)获取年、月、日、周等

函数 描述
date(datetime) 返回datetime中的日期date部分
year(date) 返回年份
quarter(date) 返回日期date是第几季节,返回 1 到 4
month(date) 返回日期date中的月份值,1 到 12
week(date) 计算日期 date 是本年的第几个星期,范围是 0 到 53
day(date) 返回日期值 date 的日期部分
hour(time) 返回 date 中的小时值
minute(time) 返回 date 中的分钟值
second(time) 返回 t 中的秒钟值
microsecond(time) 返回日期参数所对应的微秒数
extract(type from date) 从日期 date 中获取指定的值,type 指定返回的值
weekday(date) 日期 date 是星期几,0 表示星期一,1 表示星期二...

本文中type的取值:

year(年)、quarter(季)、month(月)、week(周)、day(天)、hour(小时)、minute(分钟)、second(秒)、microsecond(毫秒)。

(2)获取年月、年月日等

函数 描述
year、month、day 使用and连接单个返回值
date_format(event_time,’unit‘) 按照unit取值
substring(date, start, length) 从字符串 str 的 start 位置开始截取长度为 length 的子字符串
like 模糊查询

本文中unit的取值:

%M 月名字(January……December) 
%W 星期名字(Sunday……Saturday) 
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) 
%Y 年, 数字, 4 位 
%y 年, 数字, 2 位 
%a 缩写的星期名字(Sun……Sat) 
%d 月份中的天数, 数字(00……31) 
%e 月份中的天数, 数字(0……31) 
%m 月, 数字(01……12) 
%c 月, 数字(1……12) 
%b 缩写的月份名字(Jan……Dec) 
%j 一年中的天数(001……366) 
%H 小时(00……23) 
%k 小时(0……23) 
%h 小时(01……12) 
%I 小时(01……12) 
%l 小时(1……12) 
%i 分钟, 数字(00……59) 
%r 时间,12 小时(hh:mm:ss [AP]M) 
%T 时间,24 小时(hh:mm:ss) 
%S 秒(00……59) 
%s 秒(00……59) 
%p AM或PM 
%w 一个星期中的天数(0=Sunday ……6=Saturday ) 
%U 星期(0……52), 这里星期天是星期的第一天 
%u 星期(0……52), 这里星期一是星期的第一天 
%% 一个文字“%”。 

例如:date_format(%Y-%m-%d %H:%i:%s)得到时间戳

(3)两个日期时间的整数差

函数 描述
datediff(date_1,date_2) 返回日期 date_1 - date_2 之间相隔的天数
timestampdiff(type,datetime_1,datetime_2) 返回 datetime_2 − datetime_1 的时间差
timediff(time_1, time_2)计算时间差值 返回time_1 - time_2 的时间差值

参数说明:

type:参数确定(end-begin)结果的单位,表示为整数。可以填year(年)、quarter(季)、month(月)、week(周)、day(天)、hour(小时)、minute(分钟)、second(秒)、microsecond(毫秒)。

返回datetime_2-datetime_1的结果,其中datetime_1和datetime_2是date或者datetime表达式,也可以是混合类型;

当datetime_1>datetime_2时,返回的结果为负;

当datetime_1<datetime_2时,返回的结果为正。

  • 什么时候使用datediff?什么时候使用timestampdiff?什么时候使用timediff?
三个函数的区别主要在于对象的不同一个是日期,一个是时间,另外一个既可以是日期格式也可以是时间格式。
timestampdiff更加灵活,既可以对日期求整数差也可以对时间求整数差。而datediff只能求日期的天数差。

(4)日期减去/加上天数得到日期 date_sub、date_add

函数 描述
date_add(date,interval expr type) 返回起始日期 date 加上一个时间段后的日期
date_sub(date,interval expr type) 返回函数从日期减去指定的时间间隔
addtime(time,n) 返回n 是一个时间表达式,时间 t 加上时间表达式 n
subtime(time,n) 时间 t 减去 n 秒的时间

(5)日期date是周几

函数 描述
weekday(date) 日期 date 是星期几,0 表示星期一,1 表示星期二...
date_format(date,'%W') 日期 date 是星期几,Monday周一,Tuesday周二...
week(date) 计算日期 date 是本年的第几个星期,范围是 0 到 53

(6)某个月的最后一天

函数 描述
last_day(date) 返回给定日期的那一月份的最后一天

(7)返回当前日期/时间

函数 描述
curdate()、current_date() 返回当前日期
curtime()、current_time() 返回当前时间
now() 返回当前日期和时间

三、实例

分为两部分,简单和复杂实例,简单实例是为了便于理解函数的使用,复杂实例是结合业务场景给出了常见的问题。

1、简单实例

  • 获取年、月、日、周等
# 返回'2023-01-09 22:32:17'的 年月日等 部分
select
	date('2023-01-09 22:32:17');			  -- 2023-01-09
select
	year('2023-01-09 22:32:17');			  -- 2023
select
	quarter('2023-01-09 22:32:17');			  -- 1
select
	month('2023-01-09 22:32:17');			  -- 1
select
	week('2023-01-09 22:32:17');			  -- 2(本年第二周)
select
	day('2023-01-09 22:32:17');			      -- 9
select
	hour('2023-01-09 22:32:17');			  -- 22
select
	minute('2023-01-09 22:32:17');			  -- 32
select
	second('2023-01-09 22:32:17');			  -- 17
select
	extract(day from '2023-01-09 22:32:17');  -- 9
select
	weekday('2023-01-09 22:32:17');			-- 0(周一)
  • 获取年月、年月日等
# 返回'2023-01-09 22:32:17'的 年月、年月日等部分
select 
	date_format('2023-01-09 22:32:17','%Y%m');						  -- 202301
select 
	date_format('2023-01-09 22:32:17','%y%m');						  -- 2301
select 
	date_format('2023-01-09 22:32:17','%Y-%m-%d');					  -- 2023-01-09
select 
	date_format('2023-01-09 22:32:17','%H:%i');					  	  -- 22:32
select 
	date_format('2023-01-09 22:32:17','%s');					  	  -- 17
select 
	substring('2023-01-09 22:32:17',1,7);						  	  -- 2023-01
select 
	substring('2023-01-09 22:32:17',1,10);						  	  -- 2023-01-09
select 
	substring('2023-01-09 22:32:17',12,5);						  	  -- 22:32
select 
	substring('2023-01-09 22:32:17',18,2);						  	  -- 17
  • 两个日期时间的整数差/和
# 返回'2023-01-09 22:32:17'和 '2023-03-15 04:18:56'的 整数差或者和
select 
	datediff('2023-01-09 22:32:17','2023-03-15 04:18:56');			  	  -- -65
select 
	datediff('2023-03-15 04:18:56','2023-01-09 22:32:17');			  	  -- 65
	
select 
	timediff('2023-01-09 22:32:17','2023-03-15 04:18:56');			  	  -- -838:59:59
select 
	timediff('2023-03-15 04:18:56','2023-01-09 22:32:17');			  	  -- 838:59:59
	
select 
	timestampdiff(year,'2023-01-09 22:32:17','2023-03-15 04:18:56');	  -- 0
select 
	timestampdiff(year,'2023-03-15 04:18:56','2023-01-09 22:32:17');	  -- 0
	
select 
	timestampdiff(quarter,'2023-01-09 22:32:17','2023-03-15 04:18:56');	  -- 0
select 
	timestampdiff(quarter,'2023-03-15 04:18:56','2023-01-09 22:32:17');	  -- 0
	
select 
	timestampdiff(month,'2023-01-09 22:32:17','2023-03-15 04:18:56');	  -- 2
select 
	timestampdiff(month,'2023-03-15 04:18:56','2023-01-09 22:32:17');	  -- -2
	
select 
	timestampdiff(week,'2023-01-09 22:32:17','2023-03-15 04:18:56');	  -- 9
select 
	timestampdiff(week,'2023-03-15 04:18:56','2023-01-09 22:32:17');	  -- -9
	
select 
	timestampdiff(day,'2023-01-09 22:32:17','2023-03-15 04:18:56');	  	  -- 64
select 
	timestampdiff(day,'2023-03-15 04:18:56','2023-01-09 22:32:17');	  	  -- -64
	
select 
	timestampdiff(hour,'2023-01-09 22:32:17','2023-03-15 04:18:56');	  -- 1541
select 
	timestampdiff(hour,'2023-03-15 04:18:56','2023-01-09 22:32:17');	  -- -1541
	
select 
	timestampdiff(minute,'2023-01-09 22:32:17','2023-03-15 04:18:56');	  -- 92506
select 
	timestampdiff(minute,'2023-03-15 04:18:56','2023-01-09 22:32:17');	  -- -92506
	
select 
	timestampdiff(second,'2023-01-09 22:32:17','2023-03-15 04:18:56');	  -- 5550399
select 
	timestampdiff(second,'2023-03-15 04:18:56','2023-01-09 22:32:17');	  -- -5550399
  • 日期减去/加上天数得到日期 date_sub、date_add
# 返回日期'2023-01-09 22:32:17'加上或者减去 某个时间段 的日期
select 
	date_add('2023-01-09 22:32:17',interval 2 year);			  -- 2025-01-09 22:32:17
select 
	date_add('2023-01-09 22:32:17',interval 2 quarter);			  -- 2023-07-09 22:32:17
select 
	date_add('2023-01-09 22:32:17',interval 2 month);		  	  -- 2023-03-09 22:32:17
select 
	date_add('2023-01-09 22:32:17',interval 2 week);		  	  -- 2023-01-23 22:32:17
select 
	date_add('2023-01-09 22:32:17',interval 2 day);			  	  -- 2023-01-11 22:32:17
select 
	date_add('2023-01-09 22:32:17',interval 2 hour);			  -- 2023-01-10 00:32:17
select 
	date_add('2023-01-09 22:32:17',interval 2 second);			  -- 2023-01-09 22:32:19
select 
	date_add('2023-01-09 22:32:17',interval 2 minute);			  -- 2023-01-09 22:34:17

select 
	date_sub('2023-01-09 22:32:17',interval 2 year);			  -- 2025-01-09 22:32:17
select 
	date_sub('2023-01-09 22:32:17',interval 2 quarter);			  -- 2023-07-09 22:32:17
select 
	date_sub('2023-01-09 22:32:17',interval 2 month);		  	  -- 2023-03-09 22:32:17
select 
	date_sub('2023-01-09 22:32:17',interval 2 week);		  	  -- 2023-01-23 22:32:17
select 
	date_sub('2023-01-09 22:32:17',interval 2 day);			  	  -- 2023-01-11 22:32:17
select 
	date_sub('2023-01-09 22:32:17',interval 2 hour);			  -- 2023-01-10 00:32:17
select 
	date_sub('2023-01-09 22:32:17',interval 2 second);			  -- 2023-01-09 22:32:19
select 
	date_sub('2023-01-09 22:32:17',interval 2 minute);			  -- 2023-01-09 22:34:17
# 时间格式默认秒
select 
	addtime('2023-01-09 22:32:17','22:12:00');			  		  -- 2023-01-10 20:44:17
select 
	addtime('2023-01-09 22:32:17','22:12');			  			  -- 2023-01-10 20:44:17
select 
	addtime('2023-01-09 22:32:17','22');			  			  -- 2023-01-09 22:32:39
	
select 
	subtime('2023-01-09 22:32:17','22:12:00');			  		  -- 2023-01-09 00:20:17
select 
	subtime('2023-01-09 22:32:17','22:12');			  			  -- 2023-01-09 00:20:17
select 
	subtime('2023-01-09 22:32:17','22');			  			  -- 2023-01-09 22:31:55
  • 日期date是周几
# 返回日期'2023-01-09 22:32:17' 是周几
select 
	weekday('2023-01-09 22:32:17');			  				  -- 0(周一)
select 
	week('2023-01-09 22:32:17');			  				  -- 2(本年第二周)
select 
	date_format('2023-01-09 22:32:17','%W');			  	  -- Monday(周一的英文)
  • 某个月的最后一天
# 返回日期'2023-01-09 22:32:17' 该月最后一天
select 
	last_day('2023-01-09 22:32:17');			  				  -- 2023-01-31
  • 返回当前日期/时间
# 返回当前日期或者时间
select 
	curdate(),			  				  	  -- 2023-01-23
	current_date(),			  				  -- 2023-01-23
	curtime(),			  				  	  -- 23:32:37
	current_time(),			  				  -- 23:32:37
	now();  								  -- 2023-01-23 23:32:37

2、复杂实例

students 表 (id表示主键,student_id是学号,score是平均成绩,date是作答日期)

id student_id score answer_date
1 1123 98 2023-01-08
2 2341 74 2022-02-12
3 5623 66 2022-12-23
4 4386 80 2023-01-12

(1)统计每个月12号作答的次数——month、day

#使用month、day
select 
	month(answer_date) as month,
	count(answer_date) as count
from students_score
where day(answer_date) = 12
group by month;
  • 结果
month  count
1		1
2		1

(2)统计2023年1月作答的次数——year、month、day、date_format、substring

#1、使用year、month、day
select 
	count(answer_date) 
from students_score
where month(answer_date) = 1 and year(answer_date) = 2023;

#2、使用date_format
select 
	count(answer_date) 
from students_score
where date_format(answer_date,'%Y%m') = '202301';

#3、使用substring
select 
	count(answer_date) 
from students_score
where substring(answer_date,1,7) = '2023-01';

#4、使用like
select 
	count(answer_date) 
from students_score
where answer_date like '2023-01%';

#结果:2

(3)计算2022-02-12是2022年的第几周——week(date)

select week('2022-02-12');   #6(表示第六周)

(4)计算2023-01-05是周几——date_format(date,'%W')

select date_format('2023-01-05','%W');   #Thursday(表示周四)

(5)输出students_score表中2023年在周一到周五作答的学生学号——weekday(date)

#1、使用weekday
select 
	student_id,
	weekday(answer_date) as week
from students_score
where weekday(answer_date) < 5;

#2、使用date_format(date,'%W')
select 
	student_id,
	date_format(answer_date,'%W') as week
from students_score
where date_format(answer_date,'%W') in ('Monday','Tuesday','Wednesday','Thursday','Friday');

注意两种方法的区别

  • 结果
student_id  week
5623	4
4386	3

5623	Friday
4386	Thursday

(6)计算每月平均作答次数——last_day(date)

select 
	date_format(answer_date,'%Y%m') as date_,
	count(answer_date)/day(last_day(answer_date)) as avg_num
from students_score
group by date_;
  • 结果
date_	avg_num
202202	0.0357
202212	0.0323
202301	0.0645

(7)近7天和近30天分别作答题目数量

如何计算近7天和近30天的日期:日期减去天数得到日期;另一种是日期减去日期得到天数。

  • [使用]:date_sub(date,interval expr type)、datediff(date,dt_max) 、timestampdiff(day,date,dt_max)
#先求出今日是哪一天(最大日期),往前七天是哪一天,往前30天是哪一天
with 
	main as(
    	select
			max(date(answer_date)) as now_date,
			date_sub(max(date(answer_date)),interval 6 day) as 7_date,
			date_sub(max(date(answer_date)),interval 29 day) as 30_date
		from students_score
    )

select 
	sum(if(datediff(answer_date,7_date)) >= 0,1,0) as ans_7_num,
	sum(if(datediff(answer_date,30_date)) >= 0,1,0) as ans_30_num
from students_score, main
  • 结果
ans_7_num	ans_30_num
2				3

创建 students_score 表的代码

-- ----------------------------
-- Table structure for students_score
-- ----------------------------
DROP TABLE IF EXISTS `students_score`;
CREATE TABLE `students_score`  (
  `id` int(11) NOT NULL COMMENT '主键',
  `student_id` int(11) NOT NULL COMMENT '学号',
  `score` int(11) NULL DEFAULT NULL COMMENT '成绩',
  `date` date NOT NULL COMMENT '作答日期',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of students_score
-- ----------------------------
INSERT INTO `students_score` VALUES (1, 1123, 98, '2023-01-08');
INSERT INTO `students_score` VALUES (2, 2341, 74, '2023-01-12');
INSERT INTO `students_score` VALUES (3, 5623, 66, '2022-12-23');
INSERT INTO `students_score` VALUES (4, 4386, 80, '2023-01-12');
本文转载于网络 如有侵权请联系删除

相关文章

  • [译]简编漫画介绍WebAssembly

    toc关于性能的一点小历史JavaScript是怎样运行在浏览器中的解释器的优势和劣势编译器的优势和劣势比较在执行JavaScript和WebAssembly时间花费的地方拉取(FETCHING)解析(PARSING)编译+优化(COMPILING+OPTIMIZING)再次优化(REOPTIMIZING)运行(EXECUTING)垃圾回收(GARBAGECOLLECTION)WebAssembly是如何工作的?WebAssembly又是在哪一层呢?编译成.wasm文件在JavaScript中加载.wasm模块目前的WebAssembly状态。结论关于性能的一点小历史JavaScript在1995年被创造出来,它的设计初衷并不是为了快,而且在头十年,它却是不快。然后就是浏览器开始越来越相互竞争。2008的这段时间,被称之为性能的起始阶段。多个浏览器增加了实时编译器,也就是JIT。在JavaScript运行时,JIT能够找到模式,并且基于这些模式让代码运行的更快。这些JIT的因为也就带来了浏览器代码运行效率提升的拐点。突然之间JavaScript快了10倍。随着性能的提升,JavaScr

  • mac 上学习k8s系列(12)minio

    Minio(https://github.com/minio/minio)提供对象存储服务,兼容了AWSS3存储协议,用于非结构化的数据存。非结构化对象,比如图像,音、视频,日志文件,备份镜像…等等管理不方便,不定长,大小变化大、类型多,云端的访问复杂,minio就是来解决这种场景的。非结构化的文件从数KB到5TB都能很好的支持。开源并且用Go语言开发,有web操作界面,我们可以用它来搭建兼容S3协议的存储云服务。对象存储呈现出来的是一个“桶”(bucket),你可以往“桶”里面放“对象(Object)”。这个对象包括三个部分:Key、Data、Metadata。Key:可以理解文件名,是该对象的全局唯一标识符(UID)。Key是用于检索对象,服务器和用户不需要知道数据的物理地址,也能通过它找到对象。这种方法极大地简化了数据存储。Data:也就是用户数据本体。这个不用解释了。Metadata:Metadata叫做元数据,它是对象存储一个非常独特的概念。元数据有点类似数据的标签,标签的条目类型和数量是没有限制的,可以是对象的各种描述信息。在传统的文件存储里,这类信息属于文件本身,和文件一

  • 干货 | 拆解一个 Elasticsearch Nested 类型复杂查询问题

    1、线上实战问题前置说明:本文是线上环境的实战问题拆解,涉及复杂DSL,看着会很长,但强烈建议您耐心读完。问题描述:有个复杂的场景涉及到按照求和后过滤,user_id是用户编号,gender是性别,time_label是时间标签,时间标签是nested结构,intent_order_count是意向订单数量,time是对应时间。现在要筛选出在20210510~20210610,意向订单数总和为26的男性用户,请问应该怎么写dsl语句?感觉这个场景很复杂,涉及到array判断后求和,然后求和结果做筛选条件。请帮忙看看有什么好的dsl语句,或者改变现有mapping结构。这个是mapping结构如下:PUTindex_personal { "mappings":{ "properties":{ "time_label":{ "type":"nested", "properties":{ "intent_order_count":{ "type

  • 深度学习 || 12 支持向量机&&感知器

    线性模型——支持向量机&&感知器支持向量机支持向量机(SupportVectorMachine,SVM)是一个经典两类分类算法,其找到的分割超平面具有更好的鲁棒性,因此广泛使用在很多任务上,并表现出了很强优势。给定一个两类分类器数据集\mathcal{D}=\left\{\left(\mathbf{x}^{(n)},y^{(n)}\right)\right\}_{n=1}^{N},其中y_{n}\in\{+1,-1\},如果两类样本是线性可分的,即存在一个超平面\mathbf{w}^{\mathrm{T}}\mathbf{x}+b=0 将两类样本分开,那么对于每个样本都有y^{(n)}\left(\mathbf{w}^{\mathrm{T}}\mathbf{x}^{(n)}+b\right)>0。数据集D中每个样本\mathbf{x}^{(n)}到分割超平面的距离为:\gamma^{(n)}=\frac{\left\|\mathbf{w}^{\mathrm{T}}\mathbf{x}^{(n)}+b\right\|}{\|\mathbf{w}\|}=\frac{y

  • 数值微分|向前差分和向后差分

    中心差分法详见:数值微分|中心差分法(CentralFiniteDifferenceApproximations) 求区间端点的导数时,不能用中心差分法。考虑在n个离散点x_0,x_1,x_2,...,x_n给出函数的情况,由于中心差分在x的两侧使用函数的值,因此我们将无法计算导数x_0,x_n。显然,需要只在x的一侧求值的差分表达式。这些表达式称为向前和向后有限差分(forwardandbackwardfinitedifferenceapproximations)。一阶向前和向后差分由泰勒公式可得到:f(x+h)=f(x)+hf^{\prime}(x)+\frac{h^2}{2!}f^{\prime\prime}(x)+\frac{h^3}{3!}f^{\prime\prime\prime}(x)+\frac{h^4}{4!}f^{(4)}(x)+\cdots\qquad(1) f(x-h)=f(x)-hf^{\prime}(x)+\frac{h^2}{2!}f^{\prime\prime}(x)-\frac{h^3}{3!}f^{\prime\prime\prime}(x)+\fr

  • 为什么要实现Serializable

    为什么要实现Serializable工作中我们经常在进行持久化操作和返回数据时都会使用到javabean来统一封装参数,方便操作,一般我们也都会实现Serializable接口,那么问题来了,首先:为什么要进行序列化;其次:每个实体bean都必须实现serializabel接口吗?最后:我做一些项目的时候,没有实现序列化,同样没什么影响,到底什么时候应该进行序列化操作呢?网上找了很多资料,但是感觉大都没有说的很清楚,所以结合自己的理解做一下总结。首先第一个问题,实现序列化的两个原因:1、将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;2、按值将对象从一个应用程序域发送至另一个应用程序域。实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复,所以你想如果你的对象没实现序列化怎么才能进行持久化和网络传输呢,要持久化和网络传输就得转为字节流,所以在分布式应用中及设计数据持久化的场景中,你就得实现序列化。第二个问题,是不是每个实体bean都要实现序列化,答案其实还要回归到第一个问题,那就是你的bean是否需要持久化存储媒体中以及是否需要传输给另一个

  • curl 支持 HTTP2

    curl命令支持HTTP2执行以下命令:sudoapt-getinstall-ytmuxcurlvimwgethtopgit复制首先使用curl请求https://nghttp2.org(使用了http2)。但是结果却是返回了HTTP1.1响应:$curl-Ihttps://nghttp2.org/ HTTP/1.1200OK Date:Fri,04Dec201500:00:06GMT Content-Type:text/html Content-Length:6680 Last-Modified:Thu,26Nov201515:28:33GMT Etag:"56572521-1a18" Accept-Ranges:bytes X-Backend-Header-Rtt:0.000642 Server:nghttpxnghttp2/1.5.1-DEV Via:1.1nghttpx strict-transport-security:max-age=31536000复制如果使用http2,会给我们返回一个协议不支持的错误。$curl--http2-Ihttps://n

  • 针对张逸观点的一些评点

    我看到张逸老师在最近的一些文章中喜欢提“老”字,例如: “我充分借鉴了事件风暴这种新方法,却又未完全抛弃UML这种老方法”“若有可能,我还希望再加上一个ICONIX方法,虽然它已经垂垂老矣,但该方法蕴含的一些设计思想仍有值得借鉴之处”张逸老师的关注点从编码拓展到软件开发的全部工作流,值得称赞。不过每个工作流有各自的技能需要学习,是自己的感悟还罢了,如果要传授技艺给他人,更需要高标准严要求才对。所以,我就用建模思维剖析张逸老师近期发表的一些内容,供大家参考。就先从张逸老师上面这两句话开始吧。一、不是什么都叫“方法”上面这两句话,张逸老师对各种概念一律以“方法”称呼之。其实UML是“UnifiedModelingLanguage”,是“语言”,或者“表示法”(Notation)。ICONIX则是DougRosenberg等人提出的一种使用UML的建模过程(Process)。我们先来看2001年的著作:图1摘自Rosenberg,D.,Scott,K.,ApplyingUseCaseDrivenObjectModelingwithUML:AnAnnotatede-CommerceExampl

  • win10 uwp 客户端如何发送类到 asp dotnet core 作为参数

    本文告诉大家如何在UWP或WPF客户端通过将类转换为json发送到aspdotnetcore作为方法的参数熟悉客户端开发的小伙伴在看到aspdotnetcore会发现在使用的时候实际上只是在方法上面添加一个特性,这时通过URL访问的数据就会通过路由调用到这个方法,那么如何在客户端通过URL调用到方法在方法里面传入类参数?假设有这样的一个类publicclassKebunerNeefunadrow { ///<summary> ///包的名 ///</summary> publicstringName{get;set;} publicstringVersion{set;get;} }复制需要将这个类作为参数,发送到aspdotnetcore的一个方法里面[HttpPost("Download")] publicActionResultDownload([FromBody]KebunerNeefunadrowsaljudecooBolor)复制可以通过在客户端用Json.NET将类转换为json然后调用URL这样默认通过json转换的aspdo

  • 机器人也会“生孩子”了,人工智能向人类发出挑战!

    科技发展的速度总是超过人类的想象,就像我相信外星人存在茫茫宇宙之中一样。人工智能发展的步伐,已经提前实现了一些看似不可能的高难度工程。比如在人工智能领域的研究方向下,机器人从工业应用逐渐普及到社会生活领域。人人都知道,机器人可以代替人工搬运货物,机器人可以当餐厅服务员去送菜。但,谁能想到和相信,机器人居然可以“生孩子”了。图片说明:图中右側是机器人父母,左側是机器人宝宝。机器人父母分別是蓝色和绿色的,机器人宝宝身上蓝、绿色都有。文/辛东方,80后作家、专栏作者、专注互联网科技领域据6月1日英国《每日邮报》报道,阿姆斯特丹自由大学(VrijeUniversiteitAmsterdam)的科学家們创造出一种新技术,可以让机器人透过Wi-Fi网络进行「交配」,然后再经由3D打印产生「机器人后代」。研究人员希望,有朝一日,这項技术可用于火星移民。“” 最近,史上第一个机器人“婴儿”在荷兰诞生!这是人工智能机器人领域取得的巨大成果,值得全人类欢呼和祝贺。 人工智能从提出发展到现在,已经过去六十多个年头。近半个世纪以来,人工智能领域虽然发展速度较慢,但相比较而言,还是一直有进步的。各种智能终端设备

  • docker-compose 集群_docker集群搭建

    大家好,又见面了,我是你们的朋友全栈君。 前言实际工作中我们部署一个应用,一般不仅仅只有一个容器,可能会涉及到多个,比如用到数据库,中间件MQ,web前端和后端服务,等多个容器。 我们如果一个个去启动应用,当项目非常多时,就很难记住了,所有需要一个配置文件,负责实现对Docker容器集群的快速编排。 docker-compose简介Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。 Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。 Docker-Compose的工程配置文件默认

  • 腾讯云边缘安全加速平台概览

    功能简介规则引擎旨在通过丰富的规则语言,支持按需自定义处理特定类型请求的配置规则。在规则引擎创建的自定义策略将覆盖边缘服务器的默认行为。 适用场景 站点加速处的站点级配置无法覆盖全部业务情况,不同子域名,路径或文件后缀等不同条件下有差异化配置,需针对特定请求自定义功能配置。 当前业务除了需要缓存,HTTPS等基础配置,还需要自定义CacheKey,URL重写和修改HTTP头部等其他加速功能 操作步骤 登录边缘安全加速平台控制台,在左侧菜单栏中,单击规则引擎。 在规则引擎页面,选择所需站点,单击添加规则。 在添加规则窗口中,配置相关参数,需提交规则: 仅保存:仅保存规则内容,不下发配置至现网生效。 保存并发布:保存并下发规则内容至现网生效。 关键术语 定义 说明 规则 规则包含特定类型的请求以及应用于它们的一系列操作。包括:一组条件表达式,用于定义识别请求的逻辑。一组匹配条件,定义用于识别请求的标准。定义CDN将如何处理上述请求的一组功能。 条件表达式 用于定义识别请求的逻辑,支持以下类别:IF注:IF语句可以嵌套在一层IF语句下,即执行内嵌IF语句之间必须先满足最

  • docker入门终极指南,这是我见过最好的教程

    1富Web时代,应用变得越来越强大,与此同时也越来越复杂。集群部署、隔离环境、灰度发布以及动态扩容缺一不可,而容器化则成为中间的必要桥梁。本节我们就来探索一下Docker的神秘世界,从零到一掌握Docker的基本原理与实践操作。别再守着前端那一亩三分地,是时候该开疆扩土了。一、讲个故事为了更好的理解Docker是什么,我们先来讲个故事: 我需要盖一个房子,于是我搬石头、砍木头、画图纸、盖房子。一顿操作,终于把这个房子盖好了。结果,住了一段时间,心血来潮想搬到海边去。这时候按以往的办法,我只能去海边,再次搬石头、砍木头、画图纸、盖房子。烦恼之际,跑来一个魔法师教会我一种魔法。这种魔法可以把我盖好的房子复制一份,做成「镜像」,放在我的背包里。等我到了海边,就用这个「镜像」,复制一套房子,拎包入住。是不是很神奇?对应到我们的项目中来,房子就是项目本身,镜像就是项目的复制,背包就是镜像仓库。如果要动态扩容,从仓库中取出项目镜像,随便复制就可以了。Build once,Run anywhere!不用再关注版本、兼容、部署等问题,彻底解决了「上线即崩,无休止构建」的尴尬。复制二、虚拟机与容器开始之

  • [golang]golang EqualFold 字符串比较是否相等

    [golang]golangEqualFold 字符串比较是否相等 EqualFold源码 strings.EqualFold 是忽略大小写的比较,返回bool //EqualFoldreportswhethersandt,interpretedasUTF-8strings, //areequalunderUnicodecase-folding,whichisamoregeneral //formofcase-insensitivity. funcEqualFold(s,tstring)bool{ fors!=""&&t!=""{ //Extractfirstrunefromeachstring. varsr,trrune ifs[0]<utf8.RuneSelf{ sr,s=rune(s[0]),s[1:] }else{ r,size:=utf8.DecodeRuneInString(s) sr,s=r,s[size:] } ift[0]<utf8.RuneSelf{ tr,t=rune(t[0]),t[1:] }else{ r,si

  • 卷积神经网络基础;leNet;卷积神经网络进阶(1天)

    卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层、全连接层组成,即INPUT(输入层)-CONV(卷积层)-RELU(激活函数)-POOL(池化层)-FC(全连接层) 卷积层 用它来进行特征提取,如下:    输入图像是32*32*3,3是它的深度(即R、G、B),卷积层是一个5*5*3的filter(感受野),这里注意:感受野的深度必须和输入图像的深度相同。通过一个filter与输入图像的卷积可以得到一个28*28*1的特征图,上图是用了两个filter得到了两个特征图; 我们通常会使用多层卷积层来得到更深层次的特征图。如下:      关于卷积的过程图解如下:   输入图像和filter的对应位置元素相乘再求和,最后再加上b,得到特征图。如图中所示,filterw0的第一层深度和输入图像的蓝色方框中对应元素相乘再求和得到0,其他两个深度得到2,0,则有0+2+0+1=3即图中右边特征图的第一个元素3.,卷积过后输入图像的蓝色方框再滑动,stride(步长)=2,如下:   如上图,完成卷积,得

  • 带提示删除目录下的每个子目录

    ls-l|awk'/^d/{print"startrm"$NF;system("rm-rf"$NF);print"done!"}'复制    遍历2层目录并删除 foriin`ls-d*`;doforjin`ls-d$i/*`;doecho"rm-rf$j...";rm-rf$j;echo"done";done;echo"rm-rf$i";rm-rf$i;done复制  

  • boost::asio 使用 libcurl

    curl使用asio的官方样例http://curl.haxx.se/libcurl/c/asiohiper.html,但这个例子用起来有很明细的bug,asio异步IO只注册一次,也就是第一次aync_read之后对socket的读都是由超时驱动的。自己把样例改了下。 curl和asio组合的时候相比(select,libevent,libuv)非常复杂。绝不仅仅是多了下面2个socket创建和关闭的回调函数。 CURLOPT_OPENSOCKETFUNCTION创建套接字 CURLOPT_CLOSESOCKETFUNCTION 关闭套接字     还有下面这些坑:   1.通过 CURLMOPT_SOCKETFUNCTION的回调函数 remove套接字的读写事件,有时候会发生在CURLOPT_CLOSESOCKETFUNCTION回调执行之后   2.curl使用c-ares做域名解析时候,c-ares的套接字也会传给 CURLMOPT_SOCKETFUNCTION的回调函数。 此处要根据已

  • AddressSanitizer

    AddressSanitizer 在编译时加入-fsanitize=address来进行内存错误检测 AddressSanitizer AddressSanitizer用法

  • 团队项目-需求分析报告

    组长博客链接:https://www.cnblogs.com/tong-/p/11749971.html 1.1整体计划安排 主要任务 计划时间 项目选题 第七周 需求分析 第八周 安排分工 第九周 具体编写 第十,十一,十二周 优化完善 第十三周 2.1团队分工 模块名 具体内容 登录注册 实现用户注册登录 个人信息 用户登录后可在此界面查看自己的信息,并可设置昵称头像等 设置模块 设置app界面底色,护眼模式,日夜模式,字体大小等 任务板块 任务发布的区域,对任务的更新和已完成任务的处理 2.1.1各成员分工明细 成员 分工 张泽宇 产品经理 李至恒 产品经理 黄皓 原型、UI 孙庭鑫 原型、UI 沈鸿骁 前端 刘伟楠 前端(队长) 蔡嘉懿 前端 江斯强 后端 杨蓝宇 后端 林易丰 后端 2.1.2Todolist 位置 待办事项 产品经理 分析用户对软件的不同需求,并表达给原型处 原型设计 根据产品经理的要求设计出美观友好的界面,完善各项功

  • 如何让MT7603E少丢ping包

    1引言   因为一直负责QCA方案的WLAN产品研发,所以没有精力去弄MTK方案的产品。也不是MTK方案不行,而是它实在太好了,所以有太多企业、太多的人生产出了超多的产品,个人认为投入精力与物力去搞MTK方案,市场价值不大。所以,当开工厂的朋友三番五次地找我帮忙解决WLAN丢ping包问题时,我总是推脱不熟悉方案。但架不住他的磨叽,最近花了点时间来处理这个问题。  MTK的WLAN驱动,与QCA的新方案类似,也是要加载固件到MCU上。好处是你不要理解那个射频MCU,只要做好802.11上层协议即可;当然缺点很明显,你无法通过寄存器直接控制射频功能。更难受的是,搞不到文档、也没有代码文件明示或暗示过完整的寄存器组以及其具体位的功能。就算是网上流传的programming类文档,其作用也相当有限,真的仅供参考,解决不了实质问题。 2具体实施   具体硬件方案为7621A+7603E+7612E,均没有ePA;但有个PCIE卡槽以及USB3.0接口。这个我倒希望在搞稳WLAN后,可用此硬件平台调试蜂窝5G模块,从而做一个低成本的5G设备来用。直接用原厂官方的openwrt包,编译出固件上传到

  • 第2章

    练习题2.5:    答案: A.小端法:21 大端法:87 B.小端法:2143大端法:8765 C.小端法:214365大端法:876543 show_byte从低位地址的字节开始,然后逐一列出高位地址的字节。在小端法机器上,它将按照从最低有效字节到最高有效字节的顺序列出字节。在大端法机器上,它将按照从最高有效字节到最低有效字节的顺序列出字节。  练习题2.6:    答案: A.      0   0   3   5   9   1    4   1 00000000001101011001000101000001            **

相关推荐

推荐阅读