• Sql获取第一天、最后一天


    昨天面试一家公司,上机题目中要求获取每月最后一笔订单。用到了日期的选择性查询,回来在ITeye上找到了这篇文章。

    原文: http://new-fighter.iteye.com/blog/1758723

    ① 本月第一天(--减去今天再加上1天) 

    Sql代码  

    SELECT DATEADD(DD,-DAY(GETDATE())+1,GETDATE())  

    ②本月最后一天 

    Sql代码  

    SELECT DATEADD(DD,-DAY(DATEADD(M,1,GETDATE())),DATEADD(M,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天当然也会存在这样的问题,只要稍微改动一下,在减天数的时候不应减当前时间 
    的天数,而应减去加了月份之后的天数,如下写法: 

    Sql代码  

    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符合 
    正确性。 


    ③本周的星期一  

    Sql代码  

    SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)  

       本周的最后一天(星期天) 

    Sql代码  

    select dateadd(wk,(SELECT DATEDIFF(wk,0,GETDATE())),6)     

    ④一年的第一天 
      现在用年(yy)的时间间隔来显示这一年的第一天。 

    Sql代码  

    SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)  


    ⑤季度的第一天 
      假如你要计算这个季度的第一天,这个例子告诉你该如何做。 
     

    Sql代码  

    SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)   

    6一年的最后一天 
      现在用年(yy)的时间间隔来显示这一年的最后一天。 很简单,先算出这一年的第一天, 
    SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0),然后加一年减一天,即是本年的最后一天 

    Sql代码  

    SELECT DATEADD(DD,-1,DATEADD(YY,1,DATEADD(YY,DATEDIFF(YY,0,GETDATE()),0)))  

    Instance:按照每月的25日为本月的最后一天,算本月的第一天和最后一天。(上月26到这月25) 

    Sql代码  

    DECLARE @MonthBaseDate  DateTime;  

    DECLARE @MonthBeginDate DateTime;  

    DECLARE @MonthEndDate   DateTime;  

    SET @MonthBaseDate=GETDATE();  

     IF(DAY(@MonthBaseDate)>=26)  

    SET @MonthBaseDat =DATEADD(DD,6,@MonthBaseDate);   

    Select @MonthBeginDate= DATEADD(dd,25, DATEADD(mm,DATEDIFF(mm,0,DATEADD(mm,-1,GETDATE())),0)),@MonthEndDate=DATEADD(dd,24,DATEADD(mm, DATEDIFF(MM,0,GETDATE()),0))  

  • 相关阅读:
    LeetCode 75. Sort Colors(按颜色进行排序)
    LeetCode 451. Sort Characters By Frequency(按照字符出现次数对字符串排序)
    LeetCode 347. Top K Frequent Elements(出现频率最多的 k 个元素)
    LeetCode 215. Kth Largest Element in an Array(数组求第k大)
    CF #629 Div.3 E(LCA)F
    系统函数
    CASE表达式
    循环得出数据库中所有的 DB_ID,DB_NAME
    数据库的编码问题
    检验临时表是否存在
  • 原文地址:https://www.cnblogs.com/mzyj/p/4384678.html
Copyright © 2020-2023  润新知