`
lizhiyu211
  • 浏览: 231505 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL计算上月最后一天、上季度最后一天、上年最后一天、到季初天数、到年初天数等

 
阅读更多

日期维度表:

SQL计算上月最后一天、上季度最后一天、上年最后一天、到季初天数、到年初天数、当前日期是季度中第几个月、当前日期是季度中第几天等


CREATE PROCEDURE sp_sz_tjrq(
@startdate        char(8),        -- 开始日期
@years            integer         -- 生成几年的数据
)
as
begin
  -- 定义局部变量
  declare   @dt_begintime        datetime           -- 开始时间
  declare   @dt_endtime          datetime           -- 结束时间
  declare   @i_loopcount         integer            -- 循环次数
  declare   @c_sxrq              char(8)            -- 系统上线日期
  declare   @c_enddate           char(8)            -- 结束日期
  declare   @i_count             integer            -- 循环变量
  declare   @c_tjrq              char(8)            -- 统计日期
  declare   @c_year              char(4)            -- 日期年
  declare   @c_month             char(2)            -- 日期月
  declare   @c_day               char(2)            -- 日期日
  declare   @c_daysofmonth       char(2)            -- 统计日期
  declare   @c_daysofseason      char(3)            -- 月中天数
  declare   @c_daysofyear        char(3)            -- 年中天数
  declare   @c_monthsofseason    char(2)            -- 季中月数
  declare   @c_seasonsofyear     char(2)            -- 年中季数
  declare   @c_yesterday         char(8)            -- 上日日期
  declare   @c_pre_month_lastday char(8)            -- 上月月末日期
  declare   @c_pre_season_lastday char(8)           -- 上季季末日期
  declare   @c_pre_year_lastday   char(8)           -- 上年年末日期
  declare   @c_year_start_day     char(8)           -- 年度起始日期
  declare   @c_year_on_year       char(8)           -- 同比日期
  -- 初始化变量
  select @c_enddate = convert(char(8),dateadd(day,-1,dateadd(year,isnull(@years,5),@startdate)),112)
  select @i_loopcount = datediff(day,@startdate,@c_enddate)
  select @i_count = 0
 
  if object_id('crmo_sz_rqdz') is null
    begin
      create table crmo_sz_rqdz(
      tjrq              char(8) not null primary key,
      year              char(4) null,
      month              char(2) null,
      day                char(2) null,
      daysofmonth        char(2) null,
      daysofseason       char(3) null,
      daysofyear         char(3) null,
      monthsofseason     char(2) null,
      seasonsofyear      char(2) null,
      yesterday          char(8) null,
      pre_month_lastday  char(8) null,
      pre_season_lastday char(8) null,
      pre_year_lastday   char(8) null,
      year_start_day     char(8) null,
      year_on_year       char(8) null)
    end
  else
    begin
      truncate table crmo_sz_rqdz    
    end
  while @i_count <= @i_loopcount
    begin
     -- 获取统计日期值
     select @c_tjrq = convert(char(8),dateadd(day,@i_count,@startdate),112)
     -- 截取统计日期年份
     select @c_year = convert(char,year(@c_tjrq))
     -- 截取统计日期月份
     select @c_month = convert(char,month(@c_tjrq))
     -- 截取统计日期天
     select @c_day = convert(char,day(@c_tjrq))
     -- 计算统计日期是本月第几天
     select @c_daysofmonth = convert(char,day(@c_tjrq))
     -- 计算统计日期是本季度第几天
     if substring(@c_tjrq,5,2) >=  '01' and substring(@c_tjrq,5,2) <=  '03'
      select @c_daysofseason = datediff(day,convert(datetime,left(@c_tjrq,4)+'0101'),convert(datetime,@c_tjrq))+1
      if substring(@c_tjrq,5,2) >=  '04' and substring(@c_tjrq,5,2) <=  '06'
      select @c_daysofseason = datediff(day,convert(datetime,left(@c_tjrq,4)+'0401'),convert(datetime,@c_tjrq))+1
      if substring(@c_tjrq,5,2) >=  '07' and substring(@c_tjrq,5,2) <=  '09'
      select @c_daysofseason = datediff(day,convert(datetime,left(@c_tjrq,4)+'0701'),convert(datetime,@c_tjrq))+1
      if substring(@c_tjrq,5,2) >=  '10' and substring(@c_tjrq,5,2) <=  '12'
      select @c_daysofseason = datediff(day,convert(datetime,left(@c_tjrq,4)+'1001'),convert(datetime,@c_tjrq))+1
      -- 计算统计日期是本年第几天
      select @c_daysofyear = convert(char(3),datepart(dy,@c_tjrq))
      -- 计算统计日期所在月是本季度第几个月 = 月份除以3取余 如果=0 则 是第三个月 如果不是0余数即为季度中的月数
      select @c_monthsofseason = case mod(month(@c_tjrq),3) when 0 then 3 else mod(month(@c_tjrq),3) end
      -- 计算统计日期所在季度是本年第几个季度
      select @c_seasonsofyear = convert(char,datepart(qq,@c_tjrq))
      -- 计算昨天日期
      select @c_yesterday = convert(char(8),dateadd(day,-1,@c_tjrq),112)
      -- 计算上月最后一天日期
      select @c_pre_month_lastday = convert(char(8),dateadd(day,-1,substring(@c_tjrq,1,6)+'01'),112)
      -- 计算上季度最后一天 = substring(dateadd(qq,-1,统计日期季度),1,4)+‘季度最后一天’
      select @c_pre_season_lastday = convert(char(8),dateadd(qq,-1,@c_tjrq),112)
      if datepart(qq,@c_pre_season_lastday) = '1'
      select @c_pre_season_lastday = substring(@c_tjrq,1,4)+'0331'
      if datepart(qq,@c_pre_season_lastday) = '2'
      select @c_pre_season_lastday = substring(@c_tjrq,1,4)+'0630'
      if datepart(qq,@c_pre_season_lastday) = '3'
      select @c_pre_season_lastday = substring(@c_tjrq,1,4)+'0930'
      if datepart(qq,@c_pre_season_lastday) = '4'
      select @c_pre_season_lastday = substring(@c_tjrq,1,4)+'1231'
      -- 计算上一年最后一天
      select @c_pre_year_lastday = convert(char(4),(year(@c_tjrq)-1)) + '1231'
      -- 计算年度起始日期 统计日期向前推364天 如果小于系统上线日期那么 起始日期= 系统上线日期
      select @c_year_start_day = convert(char(8),dateadd(day,-364,@c_tjrq),112)                                
      -- 同比日期 = 上一年本月的最后一天的日期
      select @c_year_on_year = convert(char(8),dateadd(day,-1,(substring(convert(char(8),dateadd(month,-11,@c_tjrq),112),1,6)+'01')),112)
      -- 将计算结果插入日期对照表中
      insert into crmo_sz_rqdz(tjrq,year,month,day,daysofmonth,daysofseason,daysofyear,monthsofseason,seasonsofyear,yesterday,pre_month_lastday,pre_season_lastday,pre_year_lastday,year_start_day,year_on_year)
      values(@c_tjrq,@c_year,@c_month,@c_day ,@c_daysofmonth,@c_daysofseason ,@c_daysofyear,@c_monthsofseason,@c_seasonsofyear,@c_yesterday ,@c_pre_month_lastday,@c_pre_season_lastday ,@c_pre_year_lastday,@c_year_start_day,@c_year_on_year)
      select @i_count = @i_count + 1     
    end
end
GO

1
0
分享到:
评论

相关推荐

    ORACLE获取周月季年的第一天和最后一天

    以下将详细解释如何使用SQL语句来获取周、月、季、年以及上月、前一天、上一小时的开始和结束日期。 1. **本周** 获取本周的第一天,可以使用`TRUNC`函数结合日期部分'W'或'd'(代表星期)。'd'会返回周内的第一天...

    SQL获取当前月的第一天和最后一天和当前月一共几天

    在SQL中,获取当前月的第一天、最后一天以及计算当前月的总天数是常见的日期操作,这在处理与时间相关的数据时非常有用。以下是如何使用T-SQL(SQL Server的编程语言)来实现这些功能的详细解释: 1. 获取当前月的...

    sql 连续天数查询

    在SQL中进行连续天数查询是一项常见的任务,特别是在数据分析、报表生成或业务监控等领域。这个压缩包文件包含了一个Excel测试数据文件和一个SQL语句文本文件,用于展示如何实现这样的查询。下面,我们将深入探讨...

    DB2 计算相差天数(时间)

    DB2 计算相差天数(时间),打个比方你要计算2013-10-20到2014-03-01的天数

    SQL工作日计算,只排除周末

    ### SQL工作日计算,只排除周末 在数据库管理和数据分析领域,准确地计算两个日期之间的有效工作日数量是一项非常实用的功能,特别是在需要排除周末(通常指周六和周日)的情况下。这种计算方法对于财务报告、项目...

    Sql语句 查询本周记录\本月记录\本季度记录\本年记录

    这条语句使用 `DATEPART` 函数将日期转换为季度,然后比较当前日期的季度减去一个季度以获取上季度的记录。 查询本年记录 MySQL 中,您可以使用以下语句查询本年记录: ```sql SELECT * FROM ht_invoice_...

    SQL Server各种日期计算方法

    假设我们需要获取当前日期所在的月份的第一天和最后一天,可以使用以下SQL语句: ```sql SELECT DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0) AS FirstDayOfMonth; ``` 这里解释一下上述语句的含义: - `GETDATE()...

    SQL Server 2000下日期操作的实用范例

    在SQL Server 2000中,日期操作是数据库管理中的常见任务,涉及到日期的提取、转换、比较以及计算等。以下是一些实用的日期操作范例,它们可以帮助你更有效地处理日期相关的查询。 1. **显示本月第一天**: 使用`...

    计算2个日期相差天数、去除节假日周末

    在编程领域,尤其是在数据分析、日程管理或者时间序列分析中,计算两个日期之间的差异并考虑工作日排除节假日和周末是一项常见的任务。C++作为一种强大的系统级编程语言,提供了丰富的库来处理日期和时间操作。本篇...

    得到开始日期和结束日期之间的工作日天数sql

    sql语句得到开始日期和结束日期之间的工作日天数

    SQL所有日期函数用法.pdf

    再例如,计算一个季度的最后一天,可以使用 DateAdd 函数将当前日期加上三个月,然后使用 DateDiff 函数计算出当前日期和下一个季度的第一天之间的天数。 在使用日期计算时,需要注意第一天设置的问题。不同的系统...

    sql取不同的日期

    本文将详细介绍如何使用SQL语句来获取不同的日期,包括本月天数、上个月的第一天、本周周一以及当日等。 #### 1. 获取上一天的日期 示例代码:`SELECT dateadd(dd,-1,'20100514')` **解释**:此语句用于返回指定...

    SQL语句范例-有关日期的函数

    实现方式:结合闰年判断和月份天数计算,构建出指定月份的最后一天的日期对象。 应用:在财务会计、月度统计分析中,经常需要知道每个月的最后一天,以便进行截止日期的设定。 ### 7. 计算上个月的第一天 函数原型...

    计算两个时间相差多少年月日的sql算法

    在SQL中,计算两个日期之间的差值是一种常见的需求,特别是在涉及到日期跨度的业务逻辑处理时。本文将详细介绍如何使用SQL来实现计算两个日期相差多少年、月、日的方法,并通过具体的示例代码来帮助理解这一过程。 ...

    asp.net+c#做的计算任意两天的间隔和工作日天数的源码

    本项目是一个使用ASP.NET+C#编写的源码,其主要功能是计算两个日期之间的总天数以及工作日的天数。这个功能在很多实际场景下都有应用,例如财务管理、人力资源规划或项目进度管理。 首先,让我们深入理解ASP.NET...

    SQL语句计算两个日期之间有多少个工作日的方法

    1. 如果两个日期在同一周内,只需计算从开始日期到结束日期之间的天数,减去开始日期是周末的天数,再加上结束日期是工作日的天数。 2. 如果两个日期跨越了多个周,首先计算跨越的完整周数乘以5(因为一周工作5天)...

    2023年日历(标记工作日,节假日,调休,周末),计算两个日期相差的工作日天数

    压缩包里有2个文件,用于计算两个日期相差的工作日天数(排除周末和法定节假日): 1、excel表为2023年日历数据,并且备注工作日、周末,调休、节假日类型,可导入数据库。 2、SQL文件为2023年所有日期的插入SQL,并...

    sql server 生日提醒

    - `DateDiff("d", {fn NOW()}, '2023-04-10')` 计算出当前日期与今年生日之间的天数差,假设结果为5天。 - 因为5天在0到9天之间,所以该用户会被此查询语句选中。 #### 四、注意事项 - 使用`{fn NOW()}`时需注意...

    12个用一条语句写成的有关日期函数

    提供了两种不同的方法,利用RelativeDate函数来计算下个月的第一天并减去一天,得到本月最后一天。 8. 另一种求某月天数的函数: 同样提供了两种方法,通过RelativeDate函数获取下个月第一天然后减去一天,计算出...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一) http://download.csdn.net/source/3268267 Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二) ...

Global site tag (gtag.js) - Google Analytics