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='',
@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--
SQL 生成一个日期范围的更多相关文章
- sql生成一个日期表
SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Auth ...
- sql生成连续日期(年份、月份、日期)
此随笔主在分享日常可能用到的sql函数,用于生成连续日期(年份.月份.日期) 具体的看代码及效果吧! -- ============================================= ...
- sql 生成开始日期到结束日期与开始日期的相差天数
SELECT CONVERT(VARCHAR(10), DATEADD(dd, number, '2015-10-25'), 120) AS dtDate FROM ...
- sql生成一个唯一标示
IDNEWID() 插入一条: insert into W_1(id,account,password,uname,telnumber,imei) values(NEWID(),’xiaohong’, ...
- 批处理 —— 每天生成一个以日期命名的文件(Win XP)
想达到这样一个效果:每天在某个目录下生成一个以日期命名的文件(如,0705.txt). 第一步,新建一个批处理文件 新建一个文件,比如[create_day_file.bat].编辑,输入以下内容 : ...
- ORACLE 生成一个随机数
ORACLE 如何产生一个随机数:DBMS_RANDOM--1.小数( 0 ~ 1) select dbms_random.value from dual ; --2.指定范围内的小数 ( 0 ~ 1 ...
- SQL 养成一个好习惯是一笔财富
来源:MR_ke 链接:http://www.cnblogs.com/MR_ke/archive/2011/05/29/2062085.html 我们做软件开发的,大部分人都离不开跟数据库打交道,特别 ...
- js对Date对象的操作的问题(生成一个倒数7天的数组)
今天在论坛上看到这样一个问题如下: 问题描述: 使用JavaScript生成一个倒数7天的数组.比如今天是10月1号,生成的数组是["9月25号","9月26号" ...
- SQL to_char,to_date日期字符串转换问题
1.转换函数 与date操作关系最大的就是两个转换函数:to_date(),to_char() to_date() 作用将字符类型按一定格式转化为日期类型: 具体用法:to_date('2004-11 ...
随机推荐
- Spark系列(十)TaskSchedule工作原理
工作原理图 源码分析: 1.) 25 launchedTask = true 26 } 27 } catch { 28 ...
- js滑动门及对像的使用
function scrollDoor() { } scrollDoor.prototype = { sd: function (menus, divs, openClass, closeClass) ...
- maven 的各种命令
mvn clean : 清理旧的文件 mvn clean compile : 清理 .编译 mvn clean test : 清理 .编译 .测试 mvn clean package : ...
- Tomcat线程池,更符合大家想象的可扩展线程池
因由 说起线程池,大家可能受连接池的印象影响,天然的认为,它应该是一开始有core条线程,忙不过来了就扩展到max条线程,闲的时候又回落到core条线程,如果还有更高的高峰,就放进一个缓冲队列里缓冲一 ...
- google_protobuf数据类型
要通信,必须有协议,否则双方无法理解对方的码流.在protobuf中,协议是由一系列的消息组成的.因此最重要的就是定义通信时使用到的消息格式. Protobuf消息定义 消息由至少一个字段组合而成,类 ...
- homework-10
不多不说这是一次神奇的作业,作业一拖再拖,到最后发现.... 首先,在一开始的最大字数和问题实现图形界面主要是由我的小伙伴邹同学完成的,所以当我第一次看到说要显示详细运行过程的时候感到很迷茫. 第一感 ...
- work8
使用裸指针: #include <iostream>#include <memory>#include <stdio.h>#include <cstring& ...
- ecstore b2b2c 商城页面伪静态代码 及相关注意事项
一下代码需要添加到 nginx.conf配置文件的server块,阿里云虚拟机一般在conf文件夹下建立vhost文件夹,把server块放进去,然后 在nginx.conf使用include 包含进 ...
- springboot+maven快速构建项目
最近公司运用springboot构建项目,确实比ssh搭建要快很多.springboot官方学习网站 1.首先要下载maven,用maven管理项目很方便,下载完maven配置好环境,maven我就不 ...
- ASP.NET网站如何显示自己的网页图标
转载自 http://www.webtag123.com/dotnet/17238.html 1. 直接放个ico图标到你网站的根目录,并命名为favicon.ico就可以了.favicon.ico应 ...