zoukankan      html  css  js  c++  java
  • sql 取每月第一天或最后一天

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

  • 相关阅读:
    Jmeter之http性能测试实战 非GUI模式压测 NON-GUI模式 结果解析TPS——干货(十一)
    UI Recorder 自动化测试 回归原理(九)
    UI Recorder 自动化测试 录制原理(八)
    UI Recorder 自动化测试 整体架构(七)
    UI Recorder 自动化测试 配置项(六)
    UI Recorder 自动化测试 工具栏使用(五)
    UI Recorder 自动化测试 回归测试(四)
    UI Recorder 自动化测试 录制(三)
    UI Recorder 自动化测试工具安装问题疑难杂症解决(二)
    UI Recorder 自动化测试安装教程(一)
  • 原文地址:https://www.cnblogs.com/withoutaword/p/3171436.html
Copyright © 2011-2022 走看看