SQL 生成一个日期范围

有时想按日或月生成一个序列,就像2014-1-1、2014-1-2、2014-1-3...

在sql server中可以写个函数来实现。

/*
生成一个日期范围,如2014.01、2014.02...
@Increment 步进值
@StartDate 开始日期
@EndDate   结束日期
----------------------
@SelectedRange 返回值名称(多语句表值函数的返回值必须存放在返回值变量中)
    返回表的字段和类型:
    iDate DATETIME,
    iYear char(4),
    iMonth char(2),
    iYM CHAR(7)
*/

CREATE FUNCTION [dbo].[DateRange]
(
    @Increment char(1) = ‘m‘,
    @StartDate    DATE=‘20140101‘,
    @EndDate    DATE=null
)

RETURNS @SelectedRange TABLE
(
    iDate DATE,
    iYear char(4),
    iMonth char(2),
    iYM CHAR(7)
)
AS
BEGIN
/*Default value for stored procedures parameter have to be constants.
The function GETDATE() returns a different value from time to time, so it is not a constant expression.
*/
--IF @EndDate is null
--SET @EndDate = getdate()
--or
SET @EndDate=Coalesce(@EndDate,GetDate())
        ;WITH cteRange(DateRange) AS
        (
            SELECT CAST(@StartDate AS DATE)
            UNION ALL
            SELECT
                  CASE
                        WHEN @Increment = ‘d‘ THEN DATEADD(dd, 1, DateRange)
                        WHEN @Increment = ‘w‘ THEN DATEADD(ww, 1, DateRange)
                        WHEN @Increment = ‘m‘ THEN DATEADD(mm, 1, DateRange)
                  END
            FROM cteRange
            WHERE DateRange <=
                  CASE
                        WHEN @Increment = ‘d‘ THEN DATEADD(dd, -1, @EndDate)
                        WHEN @Increment = ‘w‘ THEN DATEADD(ww, -1, @EndDate)
                        WHEN @Increment = ‘m‘ THEN DATEADD(mm, -1, @EndDate)
                  END
        )
        INSERT INTO @SelectedRange(iDate,iYear,iMonth,iYM)
        SELECT DateRange, YEAR(DateRange) [Year], MONTH(DateRange) [Month] ,CONVERT(VARCHAR(7),DateRange,102)[YM]
        FROM cteRange
        OPTION (MAXRECURSION 0);
        RETURN
END

这个函数的3个参数都设置了默认值,那么在调用的时候怎么用呢?

SELECT * FROM DateRange()

这样不写实参是不行的,如果都要用默认值,那么要写default:

SELECT * FROM DateRange(default,default,default)

如果有参数要传入:

SELECT * FROM DateRange(‘d‘,‘2014/1/1‘,‘2014/12/1‘)

这样就会显示1月1日到12月1日每天的数据:

注意在函数的参数中想写getdate()函数是不行的,因为参数要用常量,而getdate函数是个变量,所以要变通一下。

--End--

时间: 2024-08-18 09:18:45

SQL 生成一个日期范围的相关文章

sql生成一个唯一标示

IDNEWID() 插入一条: insert into W_1(id,account,password,uname,telnumber,imei) values(NEWID(),'xiaohong','123456','小红','123456789','123654789')--------------------- 作者:qq_34702058 来源:CSDN 原文:https://blog.csdn.net/qq_34702058/article/details/78983328 版权声明:

python- 按照日期格式(xxxx-xx-xx)每日生成一个文件

请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如今天生成的文件为2013-09-23.log, 并且把磁盘的使用情况写到到这个文件中. #!/usr/bin/env python #!coding=utf-8 import time import os new_time = time.strftime('%Y-%m-%d') //time.strftime()可以用来获得当前时间,可以将时间格式化为字符串 disk_status = os.popen('df -h').read

ORACLE 生成一个随机数

ORACLE 如何产生一个随机数:DBMS_RANDOM--1.小数( 0 ~ 1) select dbms_random.value from dual ; --2.指定范围内的小数 ( 0 ~ 100 ) select dbms_random.value(0,100) from dual ; --3.指定范围内的整数 ( 0 ~ 100 ) select trunc(dbms_random.value(0,100)) from dual ; --4.长度为20的随机数字串 select su

SQL 养成一个好习惯是一笔财富

来源:MR_ke 链接:http://www.cnblogs.com/MR_ke/archive/2011/05/29/2062085.html 我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么我么还能保证下一段时间系统还能流畅的运行吗?我么还能保证下一个人能看懂我么的存储过程吗?那么我结合公司平时的培训和平时个人工作经验和大家分享一下,希望对大家有帮助. 要知道sql语句,我想我们有必要知道s

(转)理解SQL原理,写出高效的SQL语句 Sql养成一个好习惯是一笔财富

我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么我们还能保证下一段时间系统还能流畅的运行吗?我们还能保证下一个人能看懂我们的存储过程吗? 要知道sql语句,我想我们有必要知道sqlserver查询分析器怎么执行我么sql语句的,我么很多人会看执行计划,或者用 profile来监视和调优查询语句或者存储过程慢的原因,但是如果我们知道查询分析器的执行逻辑顺序,下手的时候就胸有成竹,那么下手是不是有把

Sql 中常用日期转换Convert(Datetime)

CONVERT(data_type,expression[,style]) convert(varchar(10),字段名,转换格式) 说明:此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar)相互转换的时候才用到. 语句 结果SELECT CONVERT(varchar(100), GETDATE(), 0) 07 15 2009 4:06PMSELECT CONVERT(varchar(100), GETD

Java Web项目--使用Servlet生成一个页面

为了生成一个servlet对应的网页.我们需要新建一个web.xml,其中将会放置servlet的相关信息.web.xml文件放置在WebContent/WEB-INF/目录下.(我们在Eclipe中新建一个Dynamic Web Project的时候一直点"next"的话会有提示"Generate web.xml deployment descriptor",勾选该选项会默认生成一个web.xml文件).我们需要配置两对映射关系,一对是servlet名和他对应的s

js对Date对象的操作的问题(生成一个倒数7天的数组)

今天在论坛上看到这样一个问题如下: 问题描述: 使用JavaScript生成一个倒数7天的数组.比如今天是10月1号,生成的数组是["9月25号","9月26号","9月27号","9月28号","9月29号","9月30号","10月1号"].这个难点就是需要判断这个月份(可能还需要上一个月份)是30天还是31天,而且还有瑞年的2月28天或者29天. 解答思路: 不

SQL to_char,to_date日期字符串转换问题

1.转换函数 与date操作关系最大的就是两个转换函数:to_date(),to_char() to_date() 作用将字符类型按一定格式转化为日期类型: 具体用法:to_date('2004-11-27','yyyy-mm-dd'),前者为字符串,后者为转换日期格式,注意,前后两者要以一对应. 如;to_date('2004-11-27 13:34:43', 'yyyy-mm-dd hh24:mi:ss') 将得到具体的时间 多种日期格式: YYYY:四位表示的年份 YYY,YY,Y:年份的