sqlserver日期数组


with num as
(
    select number i
      from master.dbo.spt_values
     where type='p' and number <=9
),
c_num as
(
    SELECT n1.i + n10.i * 10 + n100.i * 100 + n1000.i * 1000 AS number
    FROM
      num n1
      CROSS JOIN num AS n10
      CROSS JOIN num AS n100
      CROSS JOIN num AS n1000
    --order by 1
),
  c_date as
  (
      select convert(varchar(10), DATEADD(DD, number, '2019-03-01'), 120) AS tma
      from c_num
      where number <= DATEDIFF(DD, '2019-03-01', '2019-12-31')
      --order by 1
  ),
n1 as (
select
    CONVERT(datetime,tma,101) as the_date,
    tma as dt_10,
    replace(tma,'-','') as dt_8,
    DATENAME (dw, tma) as the_day,
    datepart(weekday, tma) as the_dayy,
    DATENAME (mm,tma) the_month,
    DATENAME (yy, tma) the_year,substring(tma,9,2) as day_of_month,
    case when DATENAME (dw, tma)='星期日' then datepart(week,tma)-1 else datepart(week,tma) end week_of_year,
    --case when len(DATENAME (week, tma))=1 then '0'+ DATENAME (week, tma)  else DATENAME (week, tma)end week_of_year,
    'Q' +  CAST(DATENAME (quarter, tma)as varchar(1)) as 'quarter'
   ,substring(CONVERT(varchar(10),DATEADD(ms,-3,DATEADD(mm,DATEDIFF(m,0,CONVERT(datetime,tma,101))+1,0)),120),9,2) as diff_m,--本月多少天
          datediff(day,dateadd(qq,datediff(qq,0,getdate()),0),CONVERT(datetime,
    CONVERT(char(8),
     DATEADD(Month,
      DATEPART(Quarter,getdate())*3-Month(getdate()),
      getdate()),
     120)
    +CASE WHEN DATEPART(Quarter,getdate()) in(1,4)
     THEN '31'ELSE '30' END))+1 as diff_q--本季度多少天
    ,case when DATENAME (dw, tma)='星期日'then convert(varchar(10),dateadd(day,-6,tma),120)
         else convert(varchar(10),DATEADD(wk,DATEDIFF(wk,0,tma),0),120) end as start_w  --周第一天
    ,convert(varchar(10),dateadd(d,-day(CONVERT(datetime,tma,101))+1,CONVERT(datetime,tma,101)),120) as start_m--月第一天
    ,convert(varchar(10),dateadd(qq,datediff(qq,0,CONVERT(datetime,tma,101)),0),120) as start_q--季度第一天
    ,CONVERT(varchar(10),DATEADD(ms,-3,DATEADD(mm,DATEDIFF(m,0,CONVERT(datetime,tma,101))+1,0)),120) as end_m-- 每月的最后一天

from c_date),
n2 as (
select
       dt_8  ,---日主键PK_DATE,
      dt_10  ,---日主键PK_DATE,
       the_date,
       the_day,
       the_dayy,
       the_month,
       the_year as the_year,day_of_month,
       case when len(DATENAME (week, week_of_year))=1 then '0'+ convert(varchar(2),week_of_year)  else convert(varchar(2),week_of_year) end week_of_year,
       quarter,
       diff_m,
       diff_q,
       start_w,
       start_m,
       start_q,
       end_m
from n1  )

select       dt_8   AS WD08_06,---日主键PK_DATE,
     dt_10 AS WD08_07,---日主键PK_DATE,
      dt_10  AS WD08_08,---日主键PK_DATE,
  ----通过【日】计算【年】----------------------------------------------------------------------
     substring(dt_8,1,4)  AS  WD08_09,--PK_YEAR,年
         substring(dt_8,1,4)+'年' AS  WD08_10,--YEAR_NAME,年名称
  ----通过【日】计算【季】----------------------------------------------------------------------
     substring(quarter,2,1)   AS  WD08_11,--PK_QUARTER,季度,4
       quarter AS  WD08_12,--QUARTER_ABB,季度简写,Q4
        substring(quarter,2,1)+'季度' AS  WD08_13,--QUARTER_NAME,季度名称,4季度
      substring(dt_8,1,4)+'年'+ substring(quarter,2,1)+'季度' AS  WD08_14,-- YEARQUARTER_ABB,年月季度简写,2018-Q4

  ----通过【日】计算【月】----------------------------------------------------------------------
      the_month  AS  WD08_15,--PK_MONTH,月
      the_month+'月'  AS  WD08_16,--MONTH_NAME,月名称
     case when the_month like  '0%' then substring(the_month,2,1) else the_month end  AS  WD08_17,-- PK_MONTH_FMMM,月(去掉0和空格)
     case when the_month like  '0%' then substring(the_month,2,1) else the_month end +'月' AS  WD08_18,--MONTH_NAME_FMMM,月名称(去掉0和空格)
    substring(dt_8,1,6)   AS WD08_19,--PK_YEARMONTH,年月,YYYYMM
     substring(dt_10,1,7)  AS WD08_20,--PK_YEARMONTH,年月,YYYY-MM
  substring(dt_8,1,4)+'年'+the_month+'月' AS WD08_21, --YEARMONTH_NAME,年月名称,2018年10月


   -----旬
  case when right(dt_8,2)<=10 then '上旬' when  right(dt_8,2)<=20 then '中旬' else '下旬' end AS WD08_22,  --计算旬(中文)
  case when right(dt_8,2)<=10 then '1' when  right(dt_8,2)<=20 then '2' else '3' end  AS WD08_23, -- 旬(英文) '1' - 上旬  '2'-中旬 '3'-下旬

  ----通过【日】计算【周】----------------------------------------------------------------------
right(week_of_year,2)  AS  WD24,-- YEAR_WEEK_NUM,周数
 substring(dt_8,1,4)+'年—W'+ right(week_of_year,2)  AS  WD25,-- PK_YEARWEEK, 年周
  '第'+right(week_of_year,2)+'周'  AS WD26,--YEAR_WEEK_NAME,第X周,ISO标准周

  ----通过【日】计算【日】----------------------------------------------------------------------
dt_8   AS WD27,   --年日(YYYYMMDD)
CONVERT(varchar,the_date,111)  AS WD28,    --年日(YYYY/MM/DD)
  substring(dt_8,1,4)+'年'+the_month+'月'+ right(dt_8,2)+'日'  AS WD29,   --年日(中文)

  ----其他----------------------------------------------------------------------
convert(varchar(10),dateadd(yy,datediff(yy,0,the_date),0),120)  AS WD30,--YEAR_BEGIN_DATE,年_开始日期
convert(varchar(10),dateadd(year, datediff(year, 0, dateadd(year, 1, the_date)), -1),120) AS  WD31,--YEAR_END_DATE,年_截至日期
  DATEDIFF ( dd , dateadd(year, datediff(year, 0, the_date), 0) , dateadd(year, datediff(year, 0, dateadd(year, 1, the_date)), -1) )+1 AS  WD32,--YEAR_DAYS,年天数
  case when dt_10 = convert(varchar(10),dateadd(year, datediff(year, 0, dateadd(year, 1, the_date)), -1),120) then 1 else 0 end  AS WD33, ---IS_LASTDAY_YEAR,判断是否为年末最后一天
datediff(dd,convert(varchar(10),dateadd(yy,datediff(yy,0,the_date),0),120),the_date)+1 AS WD34,--YEAR_DAY,日在年中第几天
  datediff(dd,start_q,the_date)+1 AS WD35,--QUARTER_DAY,日在季中第几天
start_q   AS  WD36,--QUARTER_BEGIN_DATE,季度_开始日期,2018-10-01
convert(varchar(10),DATEADD(DAY,diff_q-1,the_date),120)  AS  WD37,--QUARTER_END_DATE,季度_截至日期,2018-12-31
diff_q AS  WD38,--QUARTER_DAYS,季度天数
case when dt_10 =convert(varchar(10),DATEADD(DAY,diff_q-1,the_date),120) then 1 else 0 end AS WD39,--IS_LASTDAY_QUARTER,判断是否为季度末最后一天
right(dt_8,2) AS WD34,--YEAR_DAY,日在年中第几天
  start_m AS  WD41,--MONTH_BEGIN_DATE,月_开始日期
 convert(varchar(10),dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,the_date)+1, 0)),120)  AS  WD42,--MONTH_END_DATE,月_截至日期
  diff_m AS WD43,--MONTH_DAYS,月天数
  case when dt_10=convert(varchar(10),dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,the_date)+1, 0)),120)  then 1 else 0 end  AS WD44,-- IS_LASTDAY_MONTH,判断是否为月末最后一天
  datediff(dd,start_w,the_date)+1 AS WD45,--WEEK_NUM, 周内第几天
  the_day AS WD46,--WEEK_NAME,  星期几
  start_w AS WD47,--WEEK_BEGIN_DATE,本周第一天
  convert(varchar(10),dateadd(dd,6,start_w),120)  AS WD48,--WEEK_END_DATE,本周最后一天
  case when dt_10=convert(varchar(10),dateadd(dd,6,start_w),120)  then 1 else 0 end  AS WD49, ---IS_LASTDAY_WEEK,判断是否为周末最后


  the_date
from n2 order by 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值