2021-03-12

SQL 每日一练(SQL每日一练)
@ 题目和答案来源于 wechat:SQL数据库开发

题目:

姓名请假时间请假时间到
张三2020-05-202020-05-25
张三2020-05-302020-06-01
李四2020-05-242020-05-25
李四2020-05-242020-06-05
王五2020-04-252020-06-05
OUTPUT
姓名月份总天数
李四59
李四65
王五46
王五531
王五65
张三58
张三61
note:
  1. 注意王五:
    请假时间从4月25到6月5
    所以我们要比较
  2. 张三和李四
    分情况讨论。
  3. CASE STATEMENT

步骤:

STEP 1:
select 姓名,month(请假时间)AS 月份,sum(datediff(DAY,请假时间,请假时间到)+1)AS 总天数
from T301 AS T

姓名月份总天数
张三

Step 2:
SELECT 请假时间,请假时间到,姓名
FROM T301 T1

姓名请假时间请假时间到
张三2020-05-202020-05-25

Step 3:
SELECT 姓名,请假时间,请假时间到,DATEADD(DAY, 1-DAY(请假时间,请假时间)) STARTDAY
FROM T301

姓名请假时间请假时间到STARTDAY
张三2020-05-202020-05-252020-05-01

DATEADD(DAY, 1-DAY(请假时间),请假时间)
DATEADD(DAY, 1-20, 2020-05-20)
=> DATEADD(DAY, -19, 2020-05-20)
=> 2020-05-01

Step 4:
SELECT 姓名,
CASE WHEN T2.NUMBER = 0, THEN T1.请假时间
ELSE DATEADD(MONTH, T2.NUMBER, T1.STARTDAY)
END (请假时间),
CASE WHEN DATEADD(DAY, -1, DATEADD(MONTH, T2.NUMBER+1, T1.STARTDAY))<T1.请假时间到 THEN DATEADD(DAY, -1, DATEADD(month,T2.NUMBER+1,T1.StartDay))
ElSE T1.请假时间到
END 请假时间到
From T1

姓名请假时间请假时间到
张三2020-05-20
张三2020-06-01


i.e. 2020-05-20 and 2020-05-25. 当月份为0,return->2020-05-20
i.e. 2020-05-30 and 2020-06-01. 当月份为1,return -> 2020-06-01
DATEADD(MONTH, T2.NUMBER,T1.startday)
=> DATEADD(MONTH, 1,2020-05-01)
=> 2020-06-01


i.e. DATEADD(MONTH, 2, 2020-05-01) => 2020-07-01
DATEADD(DAY,-1,2020-07-01) => 2020-07-00

JOIN master…spt_values T2 ON T2.number <= DATEDIFF(MONTH, T1.请假时间,T1.请假时间到)where T2.TYPE = ‘p’)T
Group by 姓名,month(请假时间)
order by 1,2

i.e. DATEDIFF(MONTH, 2020-05-20, 2020-05-25)
=> 0
i.e. DATEDIFF(MONTH, 2020-05-20, 2020-06-25)
=> 1

在这里插入图片描述
太难了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
embedcpp-2021-03是一个有关嵌入式C++编程的课程,于2021年3月举办。嵌入式C++编程是指在嵌入式系统中使用C++编程语言进行开发的一种方法。 在嵌入式系统中,资源通常是有限的,例如处理器速度、内存容量和存储空间等。因此,使用C++编程语言可以提供更高的灵活性和效率,帮助开发人员充分利用有限的资源。C++在嵌入式系统中的应用范围广泛,例如物联网设备、汽车电子和工业自动化等领域。 embedcpp-2021-03课程旨在向学员介绍嵌入式C++编程的基础知识和技巧。课程内容通常包括以下方面: 1. C++语法和特性:介绍C++的基本语法、面向对象编程和泛型编程等概念,以及C++11、C++14和C++17的一些新特性。 2. 嵌入式系统概述:了解嵌入式系统的基本特点、硬件和软件组成,以及与传统桌面开发的区别。 3. 低级编程:学习如何与硬件交互,包括使用寄存器、配置外设和处理中断等。还可以介绍使用汇编语言优化性能的技巧。 4. 内存管理:探讨嵌入式系统中的内存管理技术,包括堆栈和堆的使用、动态内存分配和对象生命周期管理等。 5. 实时操作系统(RTOS):介绍嵌入式系统中常用的实时操作系统,如FreeRTOS和µC/OS等,学习如何使用RTOS进行任务调度和资源管理。 除了理论知识,embedcpp-2021-03课程通常还包括实际的项目练习,以帮助学员将所学知识应用于实际场景。通过该课程,学员可以了解嵌入式C++编程的基础概念和实践技巧,为嵌入式系统开发提供了一定的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值