首页 > 数据库 >SQL上下个月写法

SQL上下个月写法

时间:2024-01-22 09:11:59浏览次数:32  
标签:下个月 day dateadd SQL 2009 写法 dd 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

标签:下个月,day,dateadd,SQL,2009,写法,dd,select,getdate
From: https://www.cnblogs.com/pxesoft/p/17979257

相关文章

  • [转帖]MySQL多版本并发控制机制(MVCC)-源码浅析
    https://zhuanlan.zhihu.com/p/144682180 MySQL多版本并发控制机制(MVCC)-源码浅析前言作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾。<<事务处理-概念与技术>>诚然讲的非常透彻,但只能提纲挈领,不能让你玩转某个真正的数据库。感谢c......
  • MySQL - 日志
    1.回滚日志(undolog)作用:保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读内容:逻辑格式的日志(当delete一条记录是,记录一条对应的insert记录,反之亦然),在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态释放:当事务提交......
  • PostgreSQL运维诊断之操作系统分析
    本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQLOperatingSystemAnalysisandDiagnosis,学完本课程可以掌握PostgreSQL操作系统性能优化分析及工具说明,操作系统工具之top/topas,操作系统工具之vmstat,操作系统工具之iostat,操作系统工具之free/lsps/swapin......
  • PostgreSQL性能优化之基准测试
    本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQLPerformanceBenchmarking,学完本课程可以掌握PostgreSQL性能基准测试基础知识,基准测试介绍,基准测试相关指标,TPCC基准测试基础,PostgreSQL测试工具介绍,PostgreSQL性能基准测试案例1之BenchmarkSQL,Bench......
  • PostgreSQL性能优化之分区表
    本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQLPartitionTable,学完本课程可以掌握PostgreSQL分区表基础知识,什么是分区表,声明式表分区与继承式的区别,PostgreSQL分区表技术的发展,PostgreSQL分区表创建与使用,PostgreSQL范围分区表创建,PostgreSQLHASH分区......
  • PostgreSQL执行计划与统计信息
    本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQLExecutionplanandstatistical,学完本课程可以掌握PostgreSQL性能优化之查询处理,PostgreSQL处理SQL的整个逻辑顺序,PostgreSQL查询处理的流程讲解,PostgreSQL性能优化之执行计划,执行计划的介绍,执行计划......
  • PostgreSQL运维诊断与监控分析
    本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQLDiagnosisandmonitoringanalysis,学完本课程可以掌握PostgreSQL日常运维检查-风哥PGSQL工具箱,风哥专用PGSQL工具箱介绍,风哥专用PGSQL工具箱使用,PostgreSQL运维实时分析与监控,PostgreSQL数据库自动化任务......
  • PostgreSQL性能分析与优化调整
    本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQLPerformanceanalysisandadjustment,学完本课程可以掌握PostgreSQL优化概述与优化方案,PostgreSQL操作系统层优化调整与建议,PostgreSQL存储系统层优化调整与建议,PostgreSQL数据库层面常用优化指标分析,Postg......
  • django使用redis集群、连接池、MySQL连接池
    redis的相关设置CACHES={"default":{"BACKEND":"django_redis.cache.RedisCache","LOCATION":["redis://127.0.0.1:6379/1","redis://127.0.0.1:6380/1",#...],"OPTIONS":{"CLIENT_......
  • PG DBA培训23:PostgreSQL执行计划与统计信息
    本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQLExecutionplanandstatistical,学完本课程可以掌握PostgreSQL性能优化之查询处理,PostgreSQL处理SQL的整个逻辑顺序,PostgreSQL查询处理的流程讲解,PostgreSQL性能优化之执行计划,执行计划的介绍,执行计划......