zoukankan      html  css  js  c++  java
  • sqlserver日期推算

    --************
    --在两个日期范围里所跨越那几周返回如:1,2表是第一周和第二周,
    declare @aa table (date datetime,weekdays int )   
    declare @i int    
    set @i=datediff(day,@bdate,@edate)    
    while(@i>=0)    
    begin    
    insert @aa    
    values (dateadd(day,@i,@bdate),datepart(week,dateadd(day,@i,@bdate)))    
    set @i=@i-1    
    end  
    select weekdays   
    into #week  
    from @AA group by weekdays 
    --************
    --在日期范围里减去周六、周日的天数
    create function a (@Sdate datetime ,@Edate datetime)  
    returns   int  
    as  
    begin  
    declare @aa table (date datetime)  
    declare @i int  
    set @i=datediff(day,@Sdate,@Edate)  
    while(@i>=0)  
    begin  
    insert @aa   
    values (dateadd(day,@i,@Sdate))  
    set @i=@i-1  
    end  
    select @i= count(*)  from @aa where   datepart(weekday,date) not in (1,7)   
    return @i  
      
    end  
    --如:select dbo.A('2004-10-01','2004-10-11') 
    --返回结果为7
    --***********
    --输入第几周得到此周的开始、结束日期
    declare @FirstDayOfYear datetime--年頭
    declare @FirstDayWeekOfYear datetime --第一周的第一天
    declare @BDate datetime
    declare @EDate datetime
    select @FirstDayOfYear= dateadd(yy,datediff(yy,0,getdate()),0)                 
    select   @FirstDayWeekOfYear=@FirstDayOfYear  - datepart(dw, @FirstDayOfYear)+1
    select  @EDate=dateadd(ww,@week,@FirstDayWeekOfYear-1 )
    select @BDate=  dateadd(ww,-1,dateadd(dd,1,@EDate)  )
    SET @BDate =convert(datetime, convert(char(10),@BDate,101))      
    SET @EDate =convert(datetime, convert(char(10),@EDate,101))
    DECLARE @dt datetime
    SET @dt=GETDATE()

    DECLARE @number int
    SET @number=3

    --1.指定日期该年的第一天或最后一天
    --第一天为1月1日、最后一天为12月31日都是固定的

    --A. 年的第一天

    SELECT CONVERT(char(5),@dt,120)+'1-1'

    --B. 年的最后一天

    SELECT CONVERT(char(5),@dt,120)+'12-31'

    --2.指定日期所在季度的第一天或最后一天
    --A. 季度的第一天

     

    SELECT CONVERT(datetime,
     
    CONVERT(char(8),
      
    DATEADD(Month,
       
    DATEPART(Quarter,@dt)*3-Month(@dt)-2,
       
    @dt),
      
    120)+'1')

    --B. 季度的最后一天(CASE判断法)

    SELECT CONVERT(datetime,
     
    CONVERT(char(8),
      
    DATEADD(Month,
       
    DATEPART(Quarter,@dt)*3-Month(@dt),
       
    @dt),
      
    120)
     
    +CASE WHEN DATEPART(Quarter,@dtin(1,4)
      
    THEN '31'ELSE '30' END)

    --C. 季度的最后一天(直接推算法)

    SELECT DATEADD(Day,-1,
     
    CONVERT(char(8),
      
    DATEADD(Month,
       
    1+DATEPART(Quarter,@dt)*3-Month(@dt),
       
    @dt),
      
    120)+'1')

    --3.指定日期所在月份的第一天或最后一天
    --A. 月的第一天

     

    SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+'1')

    --B. 月的最后一天

    SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1')

    --4.指定日期所在周的任意一天

    SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)

    --5.指定日期所在周的任意星期几
    --A.  星期天做为一周的第1天

     

    SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)

    --B.  星期一做为一周的第1天

    SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt) 

  • 相关阅读:
    面试技巧
    JDK1.8新特性(一): 接口的默认方法default
    idea2019.2安裝MybatisCodeHelper插件
    为什么要拆掉“烟囱式”系统
    git
    springboot-使用AOP日志拦截实现
    为何放弃Eclipse,选择IntelliJ IDEA,看完终于明白了
    StringUtils.isBlank()的使用
    count(1)、count(*)、count(字段)的区别
    关于redis中zset底层跳表的理解
  • 原文地址:https://www.cnblogs.com/andy_tigger/p/2343183.html
Copyright © 2011-2022 走看看