sql 语句系列(月份的第一个星期的星期一和最后一个星期的星期一)[八百章之第二十一章]
SQL 一个 系列 语句 第一个 最后 月份 星期
2023-09-14 09:01:09 时间
mysql
select y.first_monday,CASE MONTH(ADDDATE(y.first_monday,28))
when mth then ADDDATE(y.first_monday,28)
else ADDDATE(y.first_monday,21) end last_monday
from(
select case sign(DAYOFWEEK(x.dy)-2)
when 0 then x.dy
when -1 then ADDDATE(x.dy,ABS(DAYOFWEEK(x.dy)-2))
when 1 then ADDDATE(x.dy,(7-(DAYOFWEEK(x.dy)-2))) END first_monday, mth
from(
select DATE_ADD(CURRENT_DATE,INTERVAL -DAY(CURRENT_DATE)+1 DAY) dy,MONTH(CURRENT_DATE) mth
from T1
) x
) y
解析:
在前一章中介绍了:
select DATE_ADD(CURRENT_DATE,INTERVAL -DAY(CURRENT_DATE)+1 DAY) dy,MONTH(CURRENT_DATE) mth
from T1
为获取这个月的第一天。
case sign(DAYOFWEEK(x.dy)-2)
when 0 then x.dy
when -1 then ADDDATE(x.dy,ABS(DAYOFWEEK(x.dy)-2))
when 1 then ADDDATE(x.dy,(7-(DAYOFWEEK(x.dy)-2))) END first_monday, mth
因为DAYOFWEEK 可以获取星期数值,星期六为7,星期天为1 ,星期1为2。
这里判断第一天是不是星期一,如果是星期天,也就是-1,那么下一天就是星期一。
如果是星期二到星期六,那么就算,下一个星期一是多少。
select y.first_monday,CASE MONTH(ADDDATE(y.first_monday,28))
when mth then ADDDATE(y.first_monday,28)
else ADDDATE(y.first_monday,21) end last_monday
这一段是我们已经获取了第一个星期的星期一。
那么最后一个星期一,要不就是加28,4个星期,要不就是加21,3个星期。
sql server
with x(dy,mth,is_monday)as (
select temp.dy,temp.mth,case when DATEPART(DW,temp.dy)=2 then 1 else 0 end
from(
select DATEADD(day,-day(GETDATE())+1,GETDATE()) dy,MONTH(GETDATE()) mth
from T1
) temp
union all
select dateadd(DAY,1,x.dy),mth,case when
DATEPART(dw,dateadd(day,1,x.dy))=2 then 1 else 0 end
from x
where MONTH(DATEADD(DAY,1,dy))=mth
)
select MIN(x.dy) first_month,MAX(x.dy) last_month
from x
sql server 使用递归。和mysql一样得到月份的第一天,一直递归,判断这个月的每一天是否是星期一。
相关文章
- SQL注入原理分析与绕过案例.md
- 如何去写一手好SQL ?
- ORA-13532: SQL ID [string] already exists ORACLE 报错 故障修复 远程处理
- Sql存储过程游标循环的用法及sql如何使用cursor写一个简单的循环
- SQL Server比较常见数据类型详解
- 一段脚本实现自动备份并保存最近几天的SQL数据库
- SQL数据查询之DQL语言介绍
- 如何将SQL语句映射为文件操作
- sql server比较Oracle 与 SQL Server的优缺点(oracleltgt)
- SQL到Oracle的数据迁移之路(sql转换oracle)
- 如何快速连接 ASP 和 MS SQL(aspmssql连接)
- MySQL命令运行SQL语句实战指南(mysql命令运行sql)
- 数据库导入SQL脚本,使用MSSQL数据库快速实现数据迁移(sql文件导入mssql)
- 如何使用MySQL合并SQL数据?(mysql合并sql)
- SQL Server及链接串的解读研究(sqlserver链接串)
- SQL Server中更新数据表的操作指南(sqlserver更新表)
- SQL Server文件夹:让你的数据变得更有组织(sqlserver文件夹)
- MySQL SQL监控:保障数据库运行稳定的必备措施(mysql sql 监控)
- 深入解析MySQL的SQL语句(mysql的 sql语句)
- MySQL中如何添加SQL主键(mysql中sql加主键)
- 查询Oracle数据库中低效率SQL查询优化实践(Oracle低效率SQL)
- 学习 Oracle SQL实战案例分享(oracle sql案例)
- Oracle SQL基线检测实现安全性提升(oracle sql基线)