用SQL语句求 本月第一天,怎么写?

可以这样写:

SELECT DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0);

按照日期函数DATEDIFF的定义,第二个参数是开始日期,第三个参数是结束日期,那么在这里,0是什么意思?

好像在哪里看过,说日期类型,本质上也是个数值,那么在这里写0也不会有错。问题是,0是哪个日子?

SELECT CAST(0 AS DATETIME)

得到的结果是:1900-01-01 00:00:00.000

原来,0就是SQL SERVER的元年。因此,

SELECT DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0);

的意思就是,先求得今天距离元年的月份,然后用元年 + 这个相距月份,得到的日期,就是本月的第一天。

与此类似,本周星期一是

SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()),0);

来个复杂一点的,求本月第一周星期一呢?

--本月第一天
DECLARE @firstday DATETIME = DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0);
--本月第七天
DECLARE @sevenday DATETIME = DATEADD(dd,6,@firstday);
--本月第一周星期一
SELECT DATEADD(wk,DATEDIFF(wk,0,@sevenday),0);

为什么最后要用第7天来求?

假如本月第1天是周一,那么第7天是周日,是同一周;

假如本月第1天是周日,那么第7天是周六,跨了一周,周一位于第7天所在周;

两个极端情况都考虑了,其他的更清楚,就是说,本月第一周的周一,必然位于本月第7天所在的这个星期里。

最新文章

  1. MST 001
  2. 烂泥:学习ubuntu之快速搭建LNMP环境
  3. ACM 交换输出
  4. UVa 11624,两次BFS
  5. Java集合框架(四)
  6. BULK INSERT如何将大量数据高效地导入SQL Server
  7. linux --> fork()详解
  8. 为 Eureka 服务注册中心实现安全控制
  9. 【原创】运维基础之Docker(7)关于docker latest tag
  10. Git Extensions system.invalidoperationexception尚未提供文件名,因此无法启动进程
  11. 3、Sql-Ora-01033:oracle initialization or shutdown in progress
  12. windows下的C++ socket服务器(3)
  13. RDD的源码
  14. Basic Calculator - Stack(表达式计算器)
  15. css的一些基础(一)
  16. C#的lock语句
  17. [Asp.net]缓存之页面缓存,控件缓存,缓存依赖
  18. GPIO—位带操作
  19. ubuntu eclipse 集成pyDev
  20. LATEX中优化问题如何排列Max——s.t.格式

热门文章

  1. GO 协程 通道实例以及验证SnowFlake算法
  2. 三维重建5:场景中语义分析/语义SLAM/DCNN-大尺度SLAM
  3. 我的C++笔记(数据的共享与保护)
  4. swift 类型系统 Self self Type
  5. mui switch 开关js控制打开 & Cannot read property 'toggle' of null
  6. 微信小程序播放背景音乐
  7. @dalao help!!!
  8. 数据类型 scanf标准函数 sizeof关键字 二进制(day03)
  9. 《团队名称》第八次团队作业:Alpha冲刺
  10. "AssertionError: View function mapping is overwriting an existing endpoint function"如何解决