`
neednot
  • 浏览: 8930 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

T-SQL创建时间维

阅读更多
use POC
go

IF OBJECT_ID('dbo.isLeapYear','function') IS NOT NULL
	DROP function dbo.isLeapYear
IF OBJECT_ID('dbo.TD_CALENDAR','TABLE') IS NOT NULL
	DROP TABLE dbo.TD_CALENDAR
go

--创建维表
--@date_int,@date_v,@date_name,@year_int,@year_name,@quarter_int,@quarter_name,@month_int,@month_name,null
CREATE TABLE TD_CALENDAR
(
	DATE_ID int NOT NULL,
	DATE_VALUE DATE,
	DATE_NAME VARCHAR(16),
	YEAR_ID int,
	YEAR_NAME VARCHAR(16),
	QUARTER_ID int,
	QUARTER_NAME VARCHAR(16),
	MONTH_ID int,
	MONTH_NAME VARCHAR(16),
	WEEK_ID INT,
	WEEK_NAME VARCHAR(20)
);
go


--创建函数isLeapYear 判断是否为闰年,输入参数为INT型的年份
--返回1则表示是r闰年
create function isLeapYear (@year int)
returns int
AS

begin
	declare @isLeap int = 0;
	if (datediff(day,cast(@year   as   char)+ '-1-1 ',cast(@year+1   as   char)+ '-1-1 '))  = 366
		set @isLeap = 1
	else  
		set @isLeap = 0   
	  
	return @isLeap

end
go



declare @date_v date = '2000-12-31';	--设置起始年份,实际从下一年开始
declare @yearCount int	=1				--@yearCount 年数的循环计数器
declare @numbersOfYear int = 10 ;		--@yearCount 设置创建维表的年数

while @yearCount  <= @numbersOfYear

begin
	declare @i int = 0;					--循环计数器
	declare @iCount int;				--平年@iCount = 364,闰年@iCount = 365
	declare @date_int int;				--int型的date key 如20010101
	declare @date_name varchar(20);
	declare @year_int int;
	declare @year_name varchar(16);
	declare @quarter_int int;
	declare @quarter_name varchar(16);
	declare @month_int int;
	declare @month_name varchar(16);
	declare @week_int int;
	declare @week_name varchar(20);
	
	if dbo.isLeapYear(YEAR(DATEADD(DD,1,@date_v))) =1  --isLeapYear函数判断该年是否为闰年
		set @iCount = 365
	else 
		set @iCount = 364
		
	while @i <= @iCount
	begin
		--从初始化值的下一年的第一天开始,本应为DO WHILE循环的
		set @date_v = DATEADD(DD,1,@date_v);			

		--INT型的DATE KEY 用下式返回并不理想 会产生如 2011019 缺0的情况,故应改用DATEPART函数
		-- set @date_int = CONVERT(INT,DATENAME(YYYY,@date_v) + DATENAME(MM,@date_v) + DATENAME (DD,@date_v));

		set @date_int  = DATEPART (YEAR,@date_v) * 10000 + DATEPART (MONTH,@date_v)*100  +DATEPART (DAY,@date_v)
		set @date_name = DATENAME(YYYY,@date_v) + '年' + DATENAME(MM,@date_v) + '月' + DATENAME (DD,@date_v) + '日';
		set @year_int = DATEPART(YYYY,@date_v);
		set @year_name = DATENAME(YYYY,@date_v)+ '年';
		set @quarter_int = DATEPART(QUARTER,@date_v);
		set @quarter_name = '第' + DATENAME(QUARTER,@date_v) + '季度';
		set @month_int = DATEPART (MONTH,@date_v);
		set @month_name = DATENAME(MONTH,@date_v) + '月';
		set @week_int = DATEPART(WEEK ,@date_v)
		set @week_name = DATENAME(WEEK,@date_v) + '周'
	    
		insert into POC.dbo.TD_CALENDAR
		VALUES(@date_int,@date_v,@date_name,@year_int,@year_name,@quarter_int,@quarter_name,@month_int,@month_name,@week_int,@week_name);
		set @i = @i + 1;
	end
        set  @yearCount = @yearCount + 1;
end
go


--select COUNT(*) from POC.dbo.td_calendar
--where year_id = 2004

--truncate table  poc.dbo.td_calendar

 

用到的日期函数整理一下:


DATEADD (@Period,@int,@smalldatetime ) 返回smalldatetime
@Period为区间类型(Such as Year or Month )
作用:返回增减后的日期
 
DATEPART(@Period,@datetimeoffset) 返回 int
DATETIMEOFFSET数据类型,此数据类型让你存储的日期和时间(24小时制)是时区一致的
作用:取得需要日期部分的整型
 
DATENAME(@Period,@datetimeoffset)返回 nvarchar
作用:取得需要日期部分的字符串型
-- 但是实验结果是DATENAME(MONTH,'2011-01-01') 返回 N'01';
-- DATENAME(DAY,'2011-01-01') 返回N'1'


CONVERT(VARCHAR,@datetime,@argument) 
作用:日期型转换为DATE型时,第三个参数指定转换格式。具体用法参考帮助手册

0
1
分享到:
评论

相关推荐

    Microsoft sql Server 入门系列文档.doc

    - **定义**:Transact-SQL(T-SQL)是SQL Server 的查询语言,用于管理数据库及其对象。 - **主要功能**: - **创建数据库对象**:包括表、视图、存储过程等。 - **数据访问与修改**:如插入、更新和删除数据。 -...

    SQL2000自学教程

    通过学习索引的创建和管理,以及查询执行计划的分析,你可以优化查询性能,减少查询响应时间。了解如何使用EXPLAIN或SET SHOWPLAN_ALL等选项来查看和理解执行计划,将帮助你找出性能瓶颈并进行改进。 此外,SQL ...

    sqlserver使用方面

    在SQL Server中,Transact-SQL (T-SQL) 是主要的编程语言,用于执行各种数据库操作,如创建表、插入数据、更新数据和删除数据。例如,`CREATE TABLE`语句用于定义新表,`INSERT INTO`用于添加数据,`UPDATE`用于修改...

    SQL基础.doc

    但是,索引也会增加写入操作的时间消耗,因此在创建索引时需要权衡读写性能。 #### 6. 视图的使用 - **视图概念**: 视图可以看作是一个虚拟表,它是由一个SELECT语句定义的,用于从一个或多个实际表中选择数据。...

    sql应用仓库

    以上内容总结了 SQLServer 数据仓库的基本概念和技术要点,包括不同版本的特点、数据仓库的创建与维护、维度和多维数据集的设计等方面。这些知识点对于理解和运用 SQLServer 进行数据仓库构建具有重要意义。

    SQL查询结果转置源码

    该资源的标题是"SQL查询结果转置源码",描述是"将查询结果进行二维转置后输出"。该资源的标签是"SQL查询结果转置源码"。下面我们将对该资源的标题和描述进行详细的解释。 首先,我们需要了解什么是SQL查询结果转置。...

    Power BI 智能时间表模板及日期排序

    本资源提供的“Power BI 智能时间表模板及日期排序”是一个实用的工具包,它包含了Power BI仪表板的源文件以及用于创建智能时间维表的代码。下面我们将深入探讨这两个关键知识点。 1. **Power BI仪表板源文件**: ...

    SQLServer数据库基础教程.ppt

    通过学习本教程,你将能够安装和配置SQL Server,进行数据库备份与恢复,管理用户权限,编写T-SQL语句(如SELECT、INSERT、UPDATE、DELETE)来查询和操作数据,以及创建和调用触发器和存储过程,以实现更复杂的业务...

    sqlserver_xxt

    在T-SQL(Transact-SQL),SQL Server的扩展版本中,虽然大小写不敏感,但为了代码可读性,通常遵循大写字母用于关键字,小写字母用于标识符和变量的约定。 1. 字符串类型: - `CHAR(n)` 和 `NCHAR(n)` 是固定长度...

    SQL Server自学题库.pdf

    - **定义:** 存储过程是预先编译并存储在 SQL Server 中的一组 T-SQL 语句。 - **优点:** 可以提高代码复用性和执行效率。 **22. 替代触发器** - **定义:** 替代触发器是在触发触发器的修改操作之前执行的...

    SQL Server 2005入门

    在SQL Server 2005中,T-SQL是SQL Server专用的数据库查询语言,除了标准的SQL语句外,还提供了常量和变量的概念、运算符与表达式、流程控制语句(如IF...ELSE, WHILE循环等)、内置函数和游标等高级特性。...

    sqlserveR第1章_SQL_Server_数据库基础

    - **创建数据库**:使用 T-SQL 语言中的 `CREATE DATABASE` 命令来创建一个新的数据库。 - **连接数据库**:使用 SQL Server Management Studio 或其他工具连接到 SQL Server 实例。 - **执行基本操作**:使用 SQL ...

    SQL2005数据仓库设计经验

    - **缓慢变化维 (Slowly Changing Dimensions)**:提供了多种方法来处理随着时间变化的维度数据,如类型1、类型2和类型3的变化。 - **主键检索 (Key Lookup)**:在数据装载过程中,通过主键查找可以避免重复数据的...

    SQL模拟考试题及答案1.docx

    - **题目**: 在SQL中,SELEC语T句的“SELECT TOP 10”表示查询结果中(A) - **选项**: A. 前10条记录 B. 后10条记录 C. 前10%条记录 D. 后10%条记录 - **答案**: A - **解析**: `SELECT TOP 10` 用于限制查询结果的...

    (高职)《SQL-Server数据库技术》期末考试卷综合测试题带答案6.doc

    10. **修改表结构的命令**:在T-SQL中,修改表结构使用ALTER TABLE命令。 11. **视图的性质**:视图不实际存储数据,而是基于查询结果的虚拟表,可以用于数据检索、权限控制等,但不支持直接的插入、修改和删除操作...

    SQL Server 2005大型数据仓库系统设计经验分享

    4. **T-SQL 分析语句**: - **新增功能**:包括PIVOT, UNPIVOT, RANK 等。 - **意义**:提供了更为强大的数据聚合与排序功能,方便进行复杂的数据分析。 5. **NUMA 支持**: - **介绍**:支持非统一内存访问架构...

    sql server 2000复习试题

    1. T-SQL中,`HOST_NAME()`函数用于返回主机名,而`DB_NAME()`返回当前数据库的名称,`GET_DATE()`获取当前日期和时间,`UPPER()`将字符串转换为大写。因此,返回主机名的函数是B. `HOST_NAME()`。 2. `CREATE ...

    cad中标注的快捷键.docx

    - **3P** - 创建三维多段线 - **AL** - 对齐 (在三维空间中) - **AP** - 加载应用程序 - **AA** - 计算面积和周长 (在三维空间) - **AR** - 阵列 (创建多重对象拷贝) - **AAD** - 外部数据库命令管理 - **AEX** - ...

Global site tag (gtag.js) - Google Analytics