SQL 获取当前月的第一天最后一天获取当月最大最小的时间当月天数,当月第一天,当月最后一天

本文提供了一系列SQL语句来处理日期,包括获取指定日期的月份第一天、最后一天等,还介绍了如何通过SQL获取当月第一天、最后一天及每周第一天等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

declare           

@firstday datetime,          

@lastday datetime          

set @firstday=convert(varchar(10),dateadd(day,-datepart(day,GETDATE())+1,GETDATE()),23)  +' 00:00:00'                                      

set  @lastday=convert(varchar(10),dateadd(day,-1,dateadd(month,1,GETDATE()-day(GETDATE())+1)),23)+' 23:59:59'   

select @firstday,@lastday  

  

declare   @a  datetime,--去年01-01 00:00:00  

@b datetime  --今年现在  

  set   @a =Convert(varchar,CONVERT(date,DATEADD(year,-1,dateadd(day,1-day(getdate()),dateadd(month,1-MONTH(getdate()),getdate())))))+' 00:00:00'  

  set   @b =DATEADD(yy,0,GETDATE())  

  select @a,@b  

 

SELECT     dbo.Departments.DepartmentName, dbo.WorkAreas.WorkAreaName, dbo.Medium.MediumName, dbo.Usage.Usage, dbo.Usage.UsageDate

FROM         dbo.Departments RIGHT OUTER JOIN

                      dbo.Usage ON dbo.Departments.DepartmentID = dbo.Usage.DepartmentID LEFT OUTER JOIN

                      dbo.Medium ON dbo.Usage.MediumID = dbo.Medium.MediumID LEFT OUTER JOIN

                      dbo.WorkAreas ON dbo.Departments.DepartmentID = dbo.WorkAreas.DepartmentID AND dbo.Usage.WorkAreaID = dbo.WorkAreas.WorkAreaID

WHERE     (dbo.Usage.SourceType = 2)

 

select DATEADD(DD,-DAY(getdate())+1,getdate())

 

select DATEADD(DD,-DAY(getdate()),DATEADD(m,1,getdate()))

 

获取当月最大和最小的时间

 

 

SELECT CONVERT(datetime,CONVERT(char(8),getdate(),120)+'1')
SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,getdate()),120)+'1')

 

SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,getdate()),120)+'1')+' 23:59:59.998'

 

源文档 <http://zhidao.123doing.com/67877.html>

 

 

  使用SQL语句取相关日期(当月天数,当月第一天,当月最后一天,本年最后一天,当月第一个星期) 收藏

--当月天数

select day(dateadd(ms,-3,DATEADD(m, DATEDIFF(m,0,getdate())+1,0))) 

---当月第一天

select   dateadd(d,-day(getdate())+1,getdate())  

---当月最后一天

select   dateadd(d,-day(getdate()),dateadd(m,1,getdate()))

--本年最后一天

select   dateadd(d,-day(getdate()),dateadd(m,12,getdate()))

--当月第一个星期一

SELECT DATEADD(wk, DATEDIFF(wk, '', DATEADD(dd, 6 - DAY(getdate()), getdate())), '')

 

源文档 <http://blog.youkuaiyun.com/songz210/archive/2009/05/19/4200960.aspx>

 

 

 

根据一个时间获取这个时间月份的第一天

 

select CONVERT(datetime,CONVERT(char(8),'2010-05-25 00:00:00.000',120)+'1')

 

项目中用到的,获取已知年份的第一天和最后一天,觉得网来的不错,留下做个念想,下次再用。

1.一个月第一天的

Java代码

SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)  

 

SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

2.本周的星期一

Java代码

SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)  

 

SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

3.一年的第一天

Java代码

SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)  

 

SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

4.季度的第一天

Java代码

SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)  

 

SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

5.当天的半夜

Java代码

SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)  

 

SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

6.上个月的最后一天

Java代码

SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))  

 

SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

7.去年的最后一天

Java代码

SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))  

 

SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

8.本月的最后一天

Java代码

SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))  

 

SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

9.本年的最后一天

Java代码

SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))  

 

SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

 

10.本月的第一个星期一

Java代码

select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)   

 

select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)

 

 

 

 

        

C#获取当月的第一天、下月的第一天和最后一天

 

 

    DateTime Month = Convert.ToDateTime(UsageMonth);

 

            DateTime date0 = Month;

            //当月的第一天

            DateTime date1 = date0.Date.AddDays(1 - date0.Day);

            //下个月的第一天

            DateTime date2 = date0.Date.AddMonths(1);

            date2 = date2.AddDays(1 - date2.Day);

 

            DateTime t1 = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);

            //当月的最后一天

            DateTime t2 = t1.AddMonths(1).AddDays(-1);

            int days = t2.Day;

 

当前时间

select convert(datetime, convert(varchar(10),getdate(),120))

前一天时间(-1就是前一天)

select convert(datetime, convert(varchar(10),getdate()-1,120)) 

前两天时间

select convert(datetime, convert(varchar(10),getdate()-2,120)) 

 

 

 

 

随意一个时间的前一天

 

select dateadd(d,-1,getdate())

 

select dateadd(d,-1,'2010-10-16 11:00:00.000')

 

   

某天的某个时间点

 

select   distinct(convert(char(10),'2010-10-18 22:00:00.000',120))+ '   08:00:00 '

 

每天8天以前的最后一条记录,   

 

Create Table TEST(ID Int, TestTime DateTime)

Insert TEST Select 1, '2007-03-29 07:30:00'

Union All Select 2, '2007-03-29 08:00:00'

Union All Select 3, '2007-03-30 07:00:00'

Union All Select 4, '2007-03-31 07:00:00'

Union All Select 5, '2007-03-31 07:50:00'

GO

 

 

 

 

Select * From TEST A

Where Not Exists(Select 1 From TEST Where DateDiff(dd, TestTime, A.TestTime) = 0 And TestTime > A.TestTime And DatePart(Hour, TestTime) < 8)

And DatePart(Hour, TestTime) < 8

 

查询每天8点以前的最后一条记录,并且根据meterid分组

select * from Reading where Reading.SourceType = 1

 

Select * From Reading A

Where Not Exists(Select  1  From Reading Where DateDiff(dd, ReadTime, A.ReadTime) = 0

And ReadTime > A.ReadTime And DatePart(Hour, ReadTime) < 23 and Reading.SourceType = 1

and Reading.MeterID = A.MeterID)

and a.SourceType = 1 And DatePart(Hour, ReadTime) < 23

<think>我们正在使用TDSQL(兼容MySQL),需要获取当前份的第一天的日期。在MySQL中,我们可以使用一些日期函数来实现。常见的方法是使用`DATE_FORMAT`和`STR_TO_DATE`,或者使用`LAST_DAY`函数结合日期加减。但是,更简单的一种方式是:将当前日期减去(当前日期中的天数-1)天,这样就能得到当月第一天。具体做法:1.获取当前日期:使用`CURDATE()`或`NOW()`,但`CURDATE()`只返回日期部分。2.获取当前日期的天数:使用`DAY(CURDATE())`。3.然后,我们需要将当前日期减去(当前天数-1)天,因为第一天就是减去(当前天数-1)天,使得日期回到本第一天。因此,我们可以这样写:SELECTDATE_SUB(CURDATE(),INTERVAL(DAY(CURDATE())-1)DAY)ASfirst_day_of_month;另一种方法是使用`DATE_ADD`,但这里减法更直接。另外,还有一种更简洁的方式是利用`LAST_DAY`函数:先获取上个最后一天,然后加1天。但是这样写起来稍微复杂一点:SELECTDATE_ADD(LAST_DAY(DATE_SUB(CURDATE(),INTERVAL1MONTH)),INTERVAL1DAY)ASfirst_day_of_month;不过,我们也可以直接使用:SELECTDATE_FORMAT(CURDATE(),'%Y-%m-01')ASfirst_day_of_month;这种方法最简单:将当前日期格式化为年份-份-01,即当月第一天。因此,在TDSQL(兼容MySQL)中,推荐使用格式化方法:SELECTDATE_FORMAT(CURDATE(),'%Y-%m-01')ASfirst_day_of_month;或者,为了得到日期类型(而不是字符串),我们可以使用:SELECTSTR_TO_DATE(CONCAT(YEAR(CURDATE()),'-',MONTH(CURDATE()),'-01'),'%Y-%m-%d')ASfirst_day_of_month;但注意,上面的CONCAT可能会有问题,比如份为10以上没问题,但如果是1-9,则会出现'2024-1-01'这样的格式,而STR_TO_DATE可以解析。不过更简单的是使用DATE_FORMAT返回的字符串实际上也是日期格式(在MySQL中),所以可以直接作为日期使用。所以,最简洁且可靠的方法是:SELECTDATE_FORMAT(CURDATE(),'%Y-%m-01')ASfirst_day_of_month;或者,也可以使用:SELECTCONCAT(YEAR(CURDATE()),'-',LPAD(MONTH(CURDATE()),2,'0'),'-01')ASfirst_day_of_month;但第一种方法更简洁。参考引用[1]中提供了SQLServer的写法,但我们现在是TDSQL(兼容MySQL),所以不能使用。引用[2]中也是SQLServer的写法。因此,我们按照MySQL的语法来写。因此,回答用户:在TDSQL中,可以使用以下SQL语句获取当前份的第一天:```sqlSELECTDATE_FORMAT(CURDATE(),'%Y-%m-01')ASfirst_day_of_month;```或者```sqlSELECTDATE_ADD(CURDATE(),INTERVAL(1-DAY(CURDATE()))DAY)ASfirst_day_of_month;```这两种方法都可以,第一种更直观。注意:TDSQL是腾讯云数据库,兼容MySQL,所以使用MySQL的语法即可。另外,用户可能还需要考虑时区问题,但CURDATE()返回的是当前日期(根据系统时间),所以一般没有问题。生成相关问题:1.如何获取当前份的最后一天?2.如何获取上个第一天最后一天?3.TDSQL中日期函数与MySQL有什么不同吗?4.如何获取下个第一天?根据引用[1]和[2]中的一些方法,在MySQL获取最后一天可以使用`LAST_DAY`函数,例如:`SELECTLAST_DAY(CURDATE());`</think>在 TDSQL(兼容 MySQL)中获取当前第一天的日期,可以使用以下两种常用方法: ### 方法 1:使用 `DATE_FORMAT` 格式化(推荐) ```sql SELECT DATE_FORMAT(CURDATE(), '%Y-%m-01') AS first_day_of_month; ``` - **原理**: `CURDATE()` 获取当前日期 → 用 `DATE_FORMAT` 格式化为 `年--01` - **输出示例**: `2023-10-01`(若当前是 2023 年 10 ) ### 方法 2:通过日期计算 ```sql SELECT DATE_ADD( DATE_ADD(CURDATE(), INTERVAL -DAY(CURDATE()) + 1 DAY), INTERVAL 0 DAY ) AS first_day_of_month; ``` - **原理**: 1. `DAY(CURDATE())` 获取当前日期的天数(如 `15`) 2. `-DAY(CURDATE()) + 1` 计算需减去的天数(如 `-14`) 3. `DATE_ADD` 从当前日期回退到当月第一天 --- ### 验证示例 执行任一语句将返回类似结果: ``` +---------------------+ | first_day_of_month | +---------------------+ | 2023-10-01 | +---------------------+ ``` ### 相关说明 1. **时区影响**:`CURDATE()` 基于数据库时区,需确保时区配置正确。 2. **日期类型**:返回结果为标准的 `DATE` 类型,可直接用于日期计算或比较。 3. **TDSQL 兼容性**:由于 TDSQL 高度兼容 MySQL 语法(参考引用[^4]),上述方法在 TDSQL 中均有效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值