http://www.cnblogs.com/ethan-qi/archive/2012/04/23/2466292.html

网上取当月第一天和最后一天的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

分享自:junyiibm

SQL获取上个月第一天和最后一天的时间写法相关推荐

  1. C#中如何获取上个月第一天和最后一天

     一.获取上个月第一天 private DateTime FirstDayOfPreviousMonth(DateTime datetime) {return datetime.AddDays(1 ...

  2. java获取上个月第一天和最后一天时间

    java获取上个月第一天和最后一天时间 /*** 获取上一个月1号0点0分0秒的时间*/private String getBeforeFirstMonthdate()throws Exception ...

  3. php中使用carbon获取上个月第一天和最后一天

    说明:使用PHP开发项目,经常会涉及到获取昨天,前天,上周,上个月的起始时间等这种需求.有个一个比较好用的工具,Carbon类,里面封装了常用的获取方式. 这里主要统计上个月的数据,要知道上个月的第一 ...

  4. 纠正网上流传的SQL取某一时间的当月第一天和最后一天的时间写法

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

  5. PHP 日期格式化(获取上月第一天、最后一天等)

    1.获取上个月第一天及最后一天. echo date('Y-m-01', strtotime('-1 month')); echo " "; echo date('Y-m-t', ...

  6. Mysql 获取当月和上个月第一天和最后一天

    Mysql 获取当月和上个月第一天和最后一天的解决方案 获取当前日期 select curdate(); 获取当月最后一天 select last_day(curdate()): 获取本月的第一天 s ...

  7. oracle 获得月最后一天,oracle获取本月第一天和最后一天及Oracle trunc()函数的用法...

    select to_char(trunc(add_months(last_day(sysdate), -1) + 1), 'yyyy-mm-dd') "本月第一天", to_cha ...

  8. java当前月份减一个月_Java获取当前时间的上一个月和下一个月,第一天和最后一天,任意时间的第一天和最后一天,任意时间上一个月和下一个月...

    public class CalendarTest { public static void main(String[] args) { // 获取当前年份.月份.日期 Calendar cale = ...

  9. presto获取上月第一天和最后一天、当月第一天

    SELECTconcat(SUBSTR(sysdate(0), 1, 7), '-01'), --本月第一天date_add('day', - 1, CAST(concat(SUBSTR(sysdat ...

最新文章

  1. 这些重大科技领域问题,听听专家怎么说
  2. 制作嵌入式根文件系统(常见问题详解)
  3. jvm性能调优实战 -57数据日志分析系统的OOM问题排查
  4. 爱回收:十年磨一剑,出鞘亮锋芒
  5. 转载:Linux命令之查看文件占用空间大小-du,df
  6. 一个服务器9个角色的体验,谁体验过?剑网三缘起服务器合并
  7. SpringMVC异常处理 自定义异常
  8. Makefile之自动生成依赖(8)
  9. linux版本与内核对应关系,[科普] Linux 的内核与 Linux 系统之间的关系
  10. 推荐JS插件:imagesLoaded,监测图片加载情况并提供相应的事件(加载成功/失败)...
  11. bzoj 4131: 并行博弈(博弈)
  12. fft_fft_control
  13. 新疆计算机二级vb 试题,2014新疆维吾尔自治区全国计算机等级考试二级VB试题及答案...
  14. 代理模式——保护代理(三)
  15. 怎么让上下两排对齐_怎么让WORD中多行(常带下划线)头和尾都完全对齐
  16. it系统应急响应流程图_[应急处理程序] 应急响应程序6个过程
  17. 西北乱跑娃 --- requests爬虫五大反反爬机制
  18. [系统安全] 二十一.PE数字签名之(中)Signcode、PEView、010Editor、Asn1View工具用法
  19. 小小总结—— 数字删除
  20. Snort 入侵检测系统简介

热门文章

  1. 【数据结构与算法】之深入解析“路径交叉”的求解思路与算法示例
  2. 2019年第十届蓝桥杯 - 省赛 - C/C++大学A组 - D. 迷宫
  3. Algorithm Master Road:算法的时间/空间复杂度
  4. 中国大学MOOC 计算机组成原理第4章 测试(下)
  5. 《信息学奥赛一本通》高精除以高精,求它们的商和余数。
  6. 【Linux】一步一步学Linux——zip命令(67)
  7. 《汇编语言(第三版)》pushf 和 popf 指令,以及标志寄存器在 Debug 中的表示
  8. 网站服务器挂了导致排名下降,常见关键词排名消失的原因及解决对策
  9. exec 执行结果_php执行系统外部命令的4种方法
  10. npm run dev 和 npx webpack-dev-server