首页 > 其他分享 >每月第一天和最后一天

每月第一天和最后一天

时间:2022-08-26 14:23:32浏览次数:61  
标签:第一天 每月 dd 一天 dateadd 2009 day select getdate

网上取当月第一天和最后一天的SQL语句很多,有的是通过字符截取,有的是通过函数,个人还是比较偏向于使用内置函数来处理,

但是看了下网上的运用函数来取第一天和最后一天时间的SQL语句几乎都像下面这样的,其实是存在问题的,存在一个临界值得问题。


     本月第一天:select   dateadd(dd,-day(getdate())+1,getdate())  

   本月最后一天:select   dateadd(dd,-day(getdate()),dateadd(m,1,getdate()))
      上面的两句,第一句取第一天的完全没问题,第二句就有问题了,一般的想法是取最后一天,可以在当前时间上加一个月,然后减去当前时间的天数,比如随便 2009-8-27,加一个月就是2009-9-27,然后减去2009-8-27时间的天数27天 正好是2009-8-31,没问题呀。

       但是,如果当前时间本身就是最后一天的话,就会产生临界问题了,比如传入的实际是2009-5-31,最终得到的最后一天的时间其实也应该是 2009-5-31才对,如果按照上面的写法,2009-5-31加一个月是多少,2009-6-31?2009-7-1?都不是,由于月大月小的问 题,6月份只有30天,所以2009-5-31加一个月后是2009-6-30日,还是按上面的写法然后再减去2009-5-31时间的天数31天,最终 得到的最后一天是2009-5-30,傻眼了,咋回事啊?

        还有2月只有28或29天当然也会存在这样的问题,只要稍微改动一下,在减天数的时候不应减当前时间的天数,而应减去加了月份之后的天数,如下写法:
        select   dateadd(dd,-day(dateadd(m,1,getdate())),dateadd(m,1,getdate()))

        这样的话,即使6月没有31天,2009-6-30减去30天就是2009-5-31,再如2009-1-30加一个月是2009-2-28,减去28天后是2009-1-31符合正确性。

可以依此类推:


可以依此类推:

select   dateadd(dd,-day(dateadd(month,-1,getdate()))+1,dateadd(month,-1,getdate()))     /*上个月一号*/
select   dateadd(dd,-day(getdate()),getdate())                                                                      /* 上月月底 */
select   dateadd(dd,-day(getdate())+1,getdate())                                                                  /* 本月一号 */
select   dateadd(dd,-day(dateadd(month,1,getdate())),dateadd(month,1,getdate()))            /* 本月底 */
select   dateadd(dd,-day(dateadd(month,1,getdate()))+1,dateadd(month,1,getdate()))        /* 下月一号 */
select   dateadd(dd,-day(dateadd(month,2,getdate())),dateadd(month,2,getdate()))            /* 下月月底 */

如果想把时间格式转换成“yyyy/mm/dd hh:mi:ss”这种格式,可以:

select rtrim(convert(char,getdate(),111))+''+(convert(char,getdate(),108))  -- yyyy/mm/dd hh:mi:ss

 


测试:(列出上月开始和结束时间,然后转换时间格式)
 declare @time1 datetime,
              @time2 datetime,
              @time3  datetime,
              @time4 datetime

 
         set @time1 = dateadd(dd,-day(dateadd(month,-1,getdate()))+1,dateadd(month,-1,getdate())),    --上个月一号
               @time2 = dateadd(dd,-day(getdate())+1,getdate())               --本月一号
         set @time3 = rtrim(convert(char,@time1,111))+''+(convert(char,@time1,108)),
               @time4 = rtrim(convert(char,@time2,111))+''+(convert(char,@time2,108))
 
        select dateadd(dd,-day(dateadd(month,-1,getdate()))+1,dateadd(month,-1,getdate()))   
        select dateadd(dd,-day(getdate())+1,getdate()) 
        select rtrim(convert(char,@time1,111))+''+(convert(char,@time1,108))  -- yyyy/mm/dd hh:mi:ss
        select rtrim(convert(char,@time2,111))+''+(convert(char,@time2,108))  -- yyyy/mm/dd hh:mi:ss


输出结果:(sybase下)
Jan  1 2011  5:30PM                              
-                              
Feb  1 2011  5:30PM                                                                      
-                                                             
2011/01/01 17:30:58                                                                                                    
-                                                             
2011/02/01 17:30:58       

标签:第一天,每月,dd,一天,dateadd,2009,day,select,getdate
From: https://www.cnblogs.com/qiu18359243869/p/16627439.html

相关文章

  • 今晚看完,少看一篇就少听一天李健的歌
    https://www.cnblogs.com/edidu/articles/780384.htmlhttps://blog.csdn.net/hujialiangzai/article/details/118104969https://www.cnblogs.com/VvxT/archive/201......
  • 第一天开通博客
    想着第一天开通博客,便把今天用IAR调试STM32的问题写出来吧。1.程序搭建时,startup_stm32f10x_hd.s这个文件很重要,千万不要因为报警告而移除,它决定了你的中断能不能执行;2.......
  • 变的有希望的一天
    前几天我觉得我是废物我觉得的人生没有意义,我以后可能连我父亲都不如(父亲的职业搬家,卖力气的活)为什么会有这样的经历呢?我是个中专生,初中考试没考好去了中专,在中专也没有......
  • 一个奇葩的线上问题,导致我排查了一天
    昨天线上又出了个问题,花了一天的时间才找到原因,说起来原因其实特别的坑爹啊。事情是这样的,最近我们上线了一个刷新用户token的功能,也就是APP里经常有的,只要你经常操作......
  • 2022年中秋节是哪一天?中秋节放假安排用手机备忘录记录
    进入到2022年的秋天,相信有不少网友都在期待着下个节日的到来,这就是国家法定节假日之一的中秋节。那么今年中秋节是哪一天呢?2022年的中秋节依旧是农历的八月十五日,而公历的......
  • 一天一个知识点-----vue项目简单引入svg
    项目背景:vue3.0+elementPlus注意项目结构,主要涉及的几个文件及文件夹---直接上代码----1.最开始是要下载包npminstallsvg-sprite-loader2.配置项目的配置文件vu......
  • Java学习第一天
    在有C/C++基础的前提下,进行Java学习。 参考教程:https://www.bilibili.com/video/BV18V411W7oc?p=9&share_source=copy_web 垃圾收集GarbageCollection:Java有自动......
  • Java第一天
    第一天学Java 一.了解JavaJava的主要应用于各种系统、各大平台、手机app、桌面工具以及SaaS云等等 二.比较Java和其他语言Java的运用较为广泛,以c语言为基础在199......
  • cron表达式实现每年、每周、每月、每小时、每分、每秒周期执行
    首先我们先来认识一下什么是cron表达式,cron表达式的格式。  cron表达式的介绍什么是cron表达式?cron表达式是一个具有时间含义的字符串,一般用于定义定时任务的执行时间......
  • vue3学习第一天
    vue3简介:1、性能的提升(打包快,渲染快,内存少)2、源码的升级使用proxy代替defineProperty实现响应式重写虚拟dom的实现和Tree-Shaking(让打包体积变小,应用到webpack)3、更好......