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       

  • 相关阅读:
    mssql:tsql;创建表;给表添加约束;使用变量;事务,索引,视图;存储过程;触发器trigger;播放器http://www.smartgz.com/blog/Article/956.asp
    str.Replace(" ","");
    DataGrid分页;指定列的总和和平均值;显示鼠标背景色;弹出式窗口;
    .net 面试题 (1)
    数据绑定技术_单值数据绑定示例;将 DataTable,DataSet,DataView,DataReader 绑定到 DataGrid 控件示例;DataBinder.Eval;数组的值赋给ListBox1;Hashtable 绑定到;RadioButtonList;将XML 文件做为数据源绑定到控件
    Lession 17 Always young 保持年轻
    智力面试题
    Lession 16 A Polite request 彬彬有礼的要求
    几道 C 语言面试题
    建表的范例脚本,存储过程中参数的命名
  • 原文地址:https://www.cnblogs.com/withoutaword/p/3171436.html
Copyright © 2011-2022 走看看