sql生成连续日期(年份、月份、日期)

Easter79
• 阅读 704

此随笔主在分享日常可能用到的sql函数,用于生成连续日期(年份、月份、日期)

具体的看代码及效果吧!

sql生成连续日期(年份、月份、日期) sql生成连续日期(年份、月份、日期)

-- =============================================
-- Author:        <Author,Jearay>
-- Create date: <Create Date,2018/7/12>
-- Description:    <Description,返回连续日期(年份或月份或日期)>
-- =============================================
CREATE FUNCTION [dbo].[fn_GetContinuousDate]
(
    @date datetime, --基准日期
    @type nvarchar(10),--'year、y','month、mon、m','day、d','yearmonth、ym','monthday、md'
    @prev int, --往前数量
    @next int --后续数量
)
RETURNS 
    @return TABLE 
(
    DataDate date,DateAlis nvarchar(20),DateCommon nvarchar(20)
)
AS
BEGIN
    declare @tempDate date,@tempDateAlis nvarchar(20),@tempDateCommon nvarchar(20),@index int=1
    --年份
    if LOWER(@type)=N'year' or LOWER(@type)=N'y'
        begin
            set @date=dateadd(year,DATEDIFF(year,0,@date),0)
            --写入往前数量的年份
            while @prev>0
                begin
                    set @tempDate=dateadd(year,-@prev,@date)
                    insert @return
                    select @tempDate,cast(year(@tempDate) as nvarchar(4))+N'年',cast(year(@tempDate) as nvarchar(4))
                    set @prev=@prev-1
                end
            --写入当年
            insert @return
            select @date,cast(year(@date) as nvarchar(4))+N'年',cast(year(@date) as nvarchar(4))
            --写入后续数量的年份
            while @next-@index>=0
                begin
                    set @tempDate=dateadd(year,@index,@date)
                    insert @return
                    select @tempDate,cast(year(@tempDate) as nvarchar(4))+N'年',cast(year(@tempDate) as nvarchar(4))
                    set @index=@index+1
                end

        end
    --月份
    else if LOWER(@type)=N'month' or LOWER(@type)=N'm' or LOWER(@type)=N'mon'
        begin
            set @date=dateadd(month,DATEDIFF(month,0,@date),0)
            --写入往前数量的月份
            while @prev>0
                begin
                    set @tempDate=dateadd(month,-@prev,@date)
                    insert @return
                    select @tempDate,cast(year(@tempDate) as nvarchar(4))+N'年'+cast(month(@tempDate) as nvarchar(2))+N'月',cast(year(@tempDate) as nvarchar(4))+N'/'+cast(month(@tempDate) as nvarchar(2))
                    set @prev=@prev-1
                end
            --写入当月
            insert @return
            select @date,cast(year(@date) as nvarchar(4))+N'年'+cast(month(@date) as nvarchar(2))+N'月',cast(year(@date) as nvarchar(4))+N'/'+cast(month(@date) as nvarchar(2))
            --写入后续数量的月份
            while @next-@index>=0
                begin
                    set @tempDate=dateadd(month,@index,@date)
                    insert @return
                    select @tempDate,cast(year(@tempDate) as nvarchar(4))+N'年'+cast(month(@tempDate) as nvarchar(2))+N'月',cast(year(@tempDate) as nvarchar(4))+N'/'+cast(month(@tempDate) as nvarchar(2))
                    set @index=@index+1
                end

        end
    --日期
    else if LOWER(@type)=N'day' or LOWER(@type)=N'd'
        begin
            set @date=dateadd(day,DATEDIFF(day,0,@date),0)
            --写入往前数量的日期
            while @prev>0
                begin
                    set @tempDate=dateadd(day,-@prev,@date)
                    insert @return
                    select @tempDate,cast(year(@tempDate) as nvarchar(4))+N'年'+cast(month(@tempDate) as nvarchar(2))+N'月'+cast(day(@tempDate) as nvarchar(2))+N'日'
                            ,cast(year(@tempDate) as nvarchar(4))+N'/'+cast(month(@tempDate) as nvarchar(2))+N'/'+cast(day(@tempDate) as nvarchar(2))
                    set @prev=@prev-1
                end
            --写入当日
            insert @return
            select @date,cast(year(@date) as nvarchar(4))+N'年'+cast(month(@date) as nvarchar(2))+N'月'+cast(day(@date) as nvarchar(2))+N'日'
                            ,cast(year(@date) as nvarchar(4))+N'/'+cast(month(@date) as nvarchar(2))+N'/'+cast(day(@date) as nvarchar(2))
            --写入后续数量的日期
            while @next-@index>=0
                begin
                    set @tempDate=dateadd(day,@index,@date)
                    insert @return
                    select @tempDate,cast(year(@tempDate) as nvarchar(4))+N'年'+cast(month(@tempDate) as nvarchar(2))+N'月'+cast(day(@tempDate) as nvarchar(2))+N'日'
                            ,cast(year(@tempDate) as nvarchar(4))+N'/'+cast(month(@tempDate) as nvarchar(2))+N'/'+cast(day(@tempDate) as nvarchar(2))
                    set @index=@index+1
                end

        end
    --年中月
    else if LOWER(@type)=N'yearmonth' or LOWER(@type)=N'ym'
        begin
            set @date=dateadd(year,DATEDIFF(year,0,@date),0)
            set @index=0
            --写入年对应月份
            while 12-@index>0
                begin
                    set @tempDate=dateadd(month,@index,@date)
                    insert @return
                    select @tempDate,cast(month(@tempDate) as nvarchar(2))+N'月'
                            ,cast(year(@tempDate) as nvarchar(4))+N'/'+cast(month(@tempDate) as nvarchar(2))
                    set @index=@index+1
                end
        end
    --月中日, 分自然月和指定月
    else if LOWER(@type)=N'monthday' or LOWER(@type)=N'md'
        begin
            --指定月
            --指定月开始日期、结束日期
            if @prev>0 and @next>0
                begin
                    declare @endDate date
                    set @date=dateadd(month,DATEDIFF(month,0,@date),0) --获取月份
                    set @endDate=dateadd(day,@next,@date)
                    set @index=datediff(day,@endDate,dateadd(day,@prev-1,dateadd(month,-1,@date)))
                    --写入月对应日期
                    while @index<0
                        begin
                            set @tempDate=dateadd(day,@index,@endDate)
                            insert @return
                            select @tempDate,cast(year(@tempDate) as nvarchar(4))+N'年'+cast(month(@tempDate) as nvarchar(2))+N'月'+cast(day(@tempDate) as nvarchar(2))+N'日'
                                    ,@tempDate
                            set @index=@index+1
                        end                    
                end
            --自然月
            else
                begin
                    set @date=dateadd(month,DATEDIFF(month,0,@date),0)
                    set @index=datediff(day,dateadd(month,1,@date),@date)
                    set @date=dateadd(month,1,@date)
                    --写入月对应日期
                    while @index<0
                        begin
                            set @tempDate=dateadd(day,@index,@date)
                            insert @return
                            select @tempDate,cast(year(@tempDate) as nvarchar(4))+N'年'+cast(month(@tempDate) as nvarchar(2))+N'月'+cast(day(@tempDate) as nvarchar(2))+N'日'
                                    ,@tempDate
                            set @index=@index+1
                        end
                end


        end
    RETURN 
END

View Code

函数调用示例:

--返回今天往前3天至今天往后2天的连续日期
select * from dbo.fn_GetContinuousDate(getdate(),'d',3,2)

结果如下:

sql生成连续日期(年份、月份、日期)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Stella981 Stella981
3年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k