1、日期概念理解中的一些测试

sql server 函数介绍-日期类--A. 测试 datetime 精度问题
sql server 函数介绍-日期类
DECLARE @t TABLE(date char(21))
sql server 函数介绍-日期类
INSERT @t SELECT '1900-1-1 00:00:00.000'
sql server 函数介绍-日期类
INSERT @t SELECT '1900-1-1 00:00:00.001'
sql server 函数介绍-日期类
INSERT @t SELECT '1900-1-1 00:00:00.009'
sql server 函数介绍-日期类
INSERT @t SELECT '1900-1-1 00:00:00.002'
sql server 函数介绍-日期类
INSERT @t SELECT '1900-1-1 00:00:00.003'
sql server 函数介绍-日期类
INSERT @t SELECT '1900-1-1 00:00:00.004'
sql server 函数介绍-日期类
INSERT @t SELECT '1900-1-1 00:00:00.005'
sql server 函数介绍-日期类
INSERT @t SELECT '1900-1-1 00:00:00.006'
sql server 函数介绍-日期类
INSERT @t SELECT '1900-1-1 00:00:00.007'
sql server 函数介绍-日期类
INSERT @t SELECT '1900-1-1 00:00:00.008'
sql server 函数介绍-日期类
SELECT date,转换后的日期=CAST(date as datetimeFROM @t
sql server 函数介绍-日期类

2、CONVERT在日期转换中的使用示例
sql server 函数介绍-日期类--字符转换为日期时,Style的使用
sql server 函数介绍-日期类

sql server 函数介绍-日期类
--1. Style=101时,表示日期字符串为:mm/dd/yyyy格式
sql server 函数介绍-日期类
SELECT CONVERT(datetime,'11/1/2003',101)
sql server 函数介绍-日期类
--结果:2003-11-01 00:00:00.000
sql server 函数介绍-日期类

sql server 函数介绍-日期类
--2. Style=101时,表示日期字符串为:dd/mm/yyyy格式
sql server 函数介绍-日期类
SELECT CONVERT(datetime,'11/1/2003',103)
sql server 函数介绍-日期类
--结果:2003-01-11 00:00:00.000
sql server 函数介绍-日期类

sql server 函数介绍-日期类

3、SET DATEFORMAT对日期处理的影响
sql server 函数介绍-日期类--1.

4、SET LANGUAGE对日期处理的影响示例
sql server 函数介绍-日期类--以下示例演示了在不同的语言环境(SET LANGUAGE)下,DATENAME与CONVERT函数的不同结果。
sql server 函数介绍-日期类
USE master
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--设置会话的语言环境为: English
sql server 函数介绍-日期类
SET LANGUAGE N'English'
sql server 函数介绍-日期类
SELECT 
sql server 函数介绍-日期类    
DATENAME(Month,GETDATE()) AS [Month],
sql server 函数介绍-日期类    
DATENAME(Weekday,GETDATE()) AS [Weekday],
sql server 函数介绍-日期类    
CONVERT(varchar,GETDATE(),109AS [CONVERT]

5、日期格式化处理
sql server 函数介绍-日期类DECLARE @dt datetime
sql server 函数介绍-日期类
SET @dt=GETDATE()
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--1.短日期格式:yyyy-m-d
sql server 函数介绍-日期类
SELECT REPLACE(CONVERT(varchar(10),@dt,120),N'-0','-')
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--2.长日期格式:yyyy年mm月dd日 
sql server 函数介绍-日期类--
A. 方法1 
sql server 函数介绍-日期类
SELECT STUFF(STUFF(CONVERT(char(8),@dt,112),5,0,N''),8,0,N'')+N''
sql server 函数介绍-日期类
--B. 方法2 
sql server 函数介绍-日期类
SELECT DATENAME(Year,@dt)+N''+DATENAME(Month,@dt)+N''+DATENAME(Day,@dt)+N''
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--3.长日期格式:yyyy年m月d日
sql server 函数介绍-日期类
SELECT DATENAME(Year,@dt)+N''+CAST(DATEPART(Month,@dtAS varchar)+N''+DATENAME(Day,@dt)+N''
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--4.完整日期+时间格式:yyyy-mm-dd hh:mi:ss:mmm
sql server 函数介绍-日期类
SELECT CONVERT(char(11),@dt,120)+CONVERT(char(12),@dt,114)

6、日期推算处理
sql server 函数介绍-日期类DECLARE @dt datetime
sql server 函数介绍-日期类
SET @dt=GETDATE()
sql server 函数介绍-日期类
sql server 函数介绍-日期类
DECLARE @number int
sql server 函数介绍-日期类
SET @number=3
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--1.指定日期该年的第一天或最后一天
sql server 函数介绍-日期类--
A. 年的第一天
sql server 函数介绍-日期类
SELECT CONVERT(char(5),@dt,120)+'1-1'
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--B. 年的最后一天
sql server 函数介绍-日期类
SELECT CONVERT(char(5),@dt,120)+'12-31'
sql server 函数介绍-日期类
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--2.指定日期所在季度的第一天或最后一天
sql server 函数介绍-日期类--
A. 季度的第一天
sql server 函数介绍-日期类
SELECT CONVERT(datetime,
sql server 函数介绍-日期类    
CONVERT(char(8),
sql server 函数介绍-日期类        
DATEADD(Month,
sql server 函数介绍-日期类            
DATEPART(Quarter,@dt)*3-Month(@dt)-2,
sql server 函数介绍-日期类            
@dt),
sql server 函数介绍-日期类        
120)+'1')
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--B. 季度的最后一天(CASE判断法)
sql server 函数介绍-日期类
SELECT CONVERT(datetime,
sql server 函数介绍-日期类    
CONVERT(char(8),
sql server 函数介绍-日期类        
DATEADD(Month,
sql server 函数介绍-日期类            
DATEPART(Quarter,@dt)*3-Month(@dt),
sql server 函数介绍-日期类            
@dt),
sql server 函数介绍-日期类        
120)
sql server 函数介绍-日期类    
+CASE WHEN DATEPART(Quarter,@dtin(1,4)
sql server 函数介绍-日期类        
THEN '31'ELSE '30' END)
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--C. 季度的最后一天(直接推算法)
sql server 函数介绍-日期类
SELECT DATEADD(Day,-1,
sql server 函数介绍-日期类    
CONVERT(char(8),
sql server 函数介绍-日期类        
DATEADD(Month,
sql server 函数介绍-日期类            
1+DATEPART(Quarter,@dt)*3-Month(@dt),
sql server 函数介绍-日期类            
@dt),
sql server 函数介绍-日期类        
120)+'1')
sql server 函数介绍-日期类
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--3.指定日期所在月份的第一天或最后一天
sql server 函数介绍-日期类--
A. 月的第一天
sql server 函数介绍-日期类
SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+'1')
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--B. 月的最后一天
sql server 函数介绍-日期类
SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1')
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--C. 月的最后一天(容易使用的错误方法)
sql server 函数介绍-日期类
SELECT DATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt))
sql server 函数介绍-日期类
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--4.指定日期所在周的任意一天
sql server 函数介绍-日期类
SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)
sql server 函数介绍-日期类
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--5.指定日期所在周的任意星期几
sql server 函数介绍-日期类--
A.  星期天做为一周的第1天
sql server 函数介绍-日期类
SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--B.  星期一做为一周的第1天
sql server 函数介绍-日期类
SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)
sql server 函数介绍-日期类

7、特殊日期加减函数
sql server 函数介绍-日期类if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_DateADD]'and xtype in (N'FN', N'IF', N'TF'))
sql server 函数介绍-日期类    
drop function [dbo].[f_DateADD]
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类

8、查询指定日期段内过生日的人员
sql server 函数介绍-日期类--测试数据
sql server 函数介绍-日期类
DECLARE @t TABLE(ID int,Name varchar(10),Birthday datetime)
sql server 函数介绍-日期类
INSERT @t SELECT 1,'aa','1999-01-01'
sql server 函数介绍-日期类
UNION ALL SELECT 2,'bb','1996-02-29'
sql server 函数介绍-日期类
UNION ALL SELECT 3,'bb','1934-03-01'
sql server 函数介绍-日期类
UNION ALL SELECT 4,'bb','1966-04-01'
sql server 函数介绍-日期类
UNION ALL SELECT 5,'bb','1997-05-01'
sql server 函数介绍-日期类
UNION ALL SELECT 6,'bb','1922-11-21'
sql server 函数介绍-日期类
UNION ALL SELECT 7,'bb','1989-12-11'
sql server 函数介绍-日期类
sql server 函数介绍-日期类
DECLARE @dt1 datetime,@dt2 datetime
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--查询 2003-12-05 至 2004-02-28 生日的记录
sql server 函数介绍-日期类
SELECT @dt1='2003-12-05',@dt2='2004-02-28'
sql server 函数介绍-日期类
SELECT * FROM @t
sql server 函数介绍-日期类
WHERE DATEADD(Year,DATEDIFF(Year,Birthday,@dt1),Birthday)
sql server 函数介绍-日期类        
BETWEEN @dt1 AND @dt2
sql server 函数介绍-日期类    
OR DATEADD(Year,DATEDIFF(Year,Birthday,@dt2),Birthday)
sql server 函数介绍-日期类        
BETWEEN @dt1 AND @dt2


9、生成日期列表的函数

sql server 函数介绍-日期类if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_getdate]'and xtype in (N'FN', N'IF', N'TF'))
sql server 函数介绍-日期类
drop function [dbo].[f_getdate]
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类

10、工作日处理函数(标准节假日)
sql server 函数介绍-日期类if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_WorkDay]'and xtype in (N'FN', N'IF', N'TF'))
sql server 函数介绍-日期类
drop function [dbo].[f_WorkDay]
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--计算两个日期相差的工作天数
sql server 函数介绍-日期类
CREATE FUNCTION f_WorkDay(
sql server 函数介绍-日期类
@dt_begin datetime,  --计算的开始日期
sql server 函数介绍-日期类
@dt_end  datetime    --计算的结束日期
sql server 函数介绍-日期类
)RETURNS int
sql server 函数介绍-日期类
AS
sql server 函数介绍-日期类
BEGIN
sql server 函数介绍-日期类    
DECLARE @workday int,@i int,@bz bit,@dt datetime
sql server 函数介绍-日期类    
IF @dt_begin>@dt_end
sql server 函数介绍-日期类        
SELECT @bz=1,@dt=@dt_begin,@dt_begin=@dt_end,@dt_end=@dt
sql server 函数介绍-日期类    
ELSE
sql server 函数介绍-日期类        
SET @bz=0
sql server 函数介绍-日期类    
SELECT @i=DATEDIFF(Day,@dt_begin,@dt_end)+1,
sql server 函数介绍-日期类        
@workday=@i/7*5,
sql server 函数介绍-日期类        
@dt_begin=DATEADD(Day,@i/7*7,@dt_begin)
sql server 函数介绍-日期类    
WHILE @dt_begin<=@dt_end
sql server 函数介绍-日期类    
BEGIN
sql server 函数介绍-日期类        
SELECT @workday=CASE 
sql server 函数介绍-日期类            
WHEN (@@DATEFIRST+DATEPART(Weekday,@dt_begin)-1)%7 BETWEEN 1 AND 5
sql server 函数介绍-日期类            
THEN @workday+1 ELSE @workday END,
sql server 函数介绍-日期类            
@dt_begin=@dt_begin+1
sql server 函数介绍-日期类    
END
sql server 函数介绍-日期类    
RETURN(CASE WHEN @bz=1 THEN -@workday ELSE @workday END)
sql server 函数介绍-日期类
END
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类
sql server 函数介绍-日期类
sql server 函数介绍-日期类

11、工作日处理函数(自定义节假日)
sql server 函数介绍-日期类if exists (select * from dbo.sysobjects where id = object_id(N'[tb_Holiday]'and OBJECTPROPERTY(id, N'IsUserTable'= 1)
sql server 函数介绍-日期类
drop table [tb_Holiday]
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--定义节假日表
sql server 函数介绍-日期类
CREATE TABLE tb_Holiday(
sql server 函数介绍-日期类HDate 
smalldatetime primary key clustered--节假日期
sql server 函数介绍-日期类
Name nvarchar(50not null)             --假日名称
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类
sql server 函数介绍-日期类
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_WorkDay]'and xtype in (N'FN', N'IF', N'TF'))
sql server 函数介绍-日期类
drop function [dbo].[f_WorkDay]
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--计算两个日期之间的工作天数
sql server 函数介绍-日期类
CREATE FUNCTION f_WorkDay(
sql server 函数介绍-日期类
@dt_begin datetime,  --计算的开始日期
sql server 函数介绍-日期类
@dt_end  datetime   --计算的结束日期
sql server 函数介绍-日期类
)RETURNS int
sql server 函数介绍-日期类
AS
sql server 函数介绍-日期类
BEGIN
sql server 函数介绍-日期类    
IF @dt_begin>@dt_end
sql server 函数介绍-日期类        
RETURN(DATEDIFF(Day,@dt_begin,@dt_end)
sql server 函数介绍-日期类            
+1-(
sql server 函数介绍-日期类                
SELECT COUNT(*FROM tb_Holiday
sql server 函数介绍-日期类                
WHERE HDate BETWEEN @dt_begin AND @dt_end))
sql server 函数介绍-日期类    
RETURN(-(DATEDIFF(Day,@dt_end,@dt_begin)
sql server 函数介绍-日期类        
+1-(
sql server 函数介绍-日期类            
SELECT COUNT(*FROM tb_Holiday
sql server 函数介绍-日期类            
WHERE HDate BETWEEN @dt_end AND @dt_begin)))
sql server 函数介绍-日期类
END
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类
sql server 函数介绍-日期类
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_WorkDayADD]'and xtype in (N'FN', N'IF', N'TF'))
sql server 函数介绍-日期类
drop function [dbo].[f_WorkDayADD]
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--在指定日期上增加工作天数
sql server 函数介绍-日期类
CREATE FUNCTION f_WorkDayADD(
sql server 函数介绍-日期类
@date    datetime,  --基础日期
sql server 函数介绍-日期类
@workday int       --要增加的工作日数
sql server 函数介绍-日期类
)RETURNS datetime
sql server 函数介绍-日期类
AS
sql server 函数介绍-日期类
BEGIN
sql server 函数介绍-日期类    
IF @workday>0
sql server 函数介绍-日期类        
WHILE @workday>0
sql server 函数介绍-日期类            
SELECT @date=@date+@workday,@workday=count(*)
sql server 函数介绍-日期类            
FROM tb_Holiday
sql server 函数介绍-日期类            
WHERE HDate BETWEEN @date AND @date+@workday
sql server 函数介绍-日期类    
ELSE
sql server 函数介绍-日期类        
WHILE @workday<0
sql server 函数介绍-日期类            
SELECT @date=@date+@workday,@workday=-count(*)
sql server 函数介绍-日期类            
FROM tb_Holiday
sql server 函数介绍-日期类            
WHERE HDate BETWEEN @date AND @date+@workday
sql server 函数介绍-日期类    
RETURN(@date)
sql server 函数介绍-日期类
END
sql server 函数介绍-日期类

12、计算工作时间的函数
sql server 函数介绍-日期类if exists (select * from dbo.sysobjects where id = object_id(N'[tb_worktime]'and OBJECTPROPERTY(id, N'IsUserTable'= 1)
sql server 函数介绍-日期类
drop table [tb_worktime]
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--定义工作时间表
sql server 函数介绍-日期类
CREATE TABLE tb_worktime(
sql server 函数介绍-日期类    ID       
int identity(1,1PRIMARY KEY,            --序号
sql server 函数介绍-日期类
    time_start smalldatetime,                            --工作的开始时间
sql server 函数介绍-日期类
    time_end  smalldatetime,                           --工作的结束时间
sql server 函数介绍-日期类
    worktime  AS DATEDIFF(Minute,time_start,time_end)  --工作时数(分钟)
sql server 函数介绍-日期类
)
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类
sql server 函数介绍-日期类
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_WorkTime]'and xtype in (N'FN', N'IF', N'TF'))
sql server 函数介绍-日期类
drop function [dbo].[f_WorkTime]
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--计算两个日期之间的工作时间
sql server 函数介绍-日期类
CREATE FUNCTION f_WorkTime(
sql server 函数介绍-日期类
@date_begin datetime,  --计算的开始时间
sql server 函数介绍-日期类
@date_end datetime     --计算的结束时间
sql server 函数介绍-日期类
)RETURNS int
sql server 函数介绍-日期类
AS
sql server 函数介绍-日期类
BEGIN
sql server 函数介绍-日期类    
DECLARE @worktime int
sql server 函数介绍-日期类    
IF DATEDIFF(Day,@date_begin,@date_end)=0
sql server 函数介绍-日期类        
SELECT @worktime=SUM(DATEDIFF(Minute,
sql server 函数介绍-日期类            
CASE WHEN CONVERT(VARCHAR,@date_begin,108)>time_start
sql server 函数介绍-日期类                
THEN CONVERT(VARCHAR,@date_begin,108)
sql server 函数介绍-日期类                
ELSE time_start END,
sql server 函数介绍-日期类            
CASE WHEN CONVERT(VARCHAR,@date_end,108)<time_end
sql server 函数介绍-日期类                
THEN CONVERT(VARCHAR,@date_end,108)
sql server 函数介绍-日期类                
ELSE time_end END))
sql server 函数介绍-日期类        
FROM tb_worktime 
sql server 函数介绍-日期类        
WHERE time_end>CONVERT(VARCHAR,@date_begin,108)
sql server 函数介绍-日期类            
AND time_start<CONVERT(VARCHAR,@date_end,108)
sql server 函数介绍-日期类    
ELSE
sql server 函数介绍-日期类        
SET @worktime
sql server 函数介绍-日期类            
=(SELECT SUM(CASE
sql server 函数介绍-日期类                    
WHEN CONVERT(VARCHAR,@date_begin,108)>time_start
sql server 函数介绍-日期类                    
THEN DATEDIFF(Minute,CONVERT(VARCHAR,@date_begin,108),time_end)
sql server 函数介绍-日期类                    
ELSE worktime END)
sql server 函数介绍-日期类                
FROM tb_worktime 
sql server 函数介绍-日期类                
WHERE time_end>CONVERT(VARCHAR,@date_begin,108))
sql server 函数介绍-日期类            
+(SELECT SUM(CASE 
sql server 函数介绍-日期类                    
WHEN CONVERT(VARCHAR,@date_end,108)<time_end
sql server 函数介绍-日期类                    
THEN DATEDIFF(Minute,time_start,CONVERT(VARCHAR,@date_end,108))
sql server 函数介绍-日期类                    
ELSE worktime END)
sql server 函数介绍-日期类                
FROM tb_worktime 
sql server 函数介绍-日期类                
WHERE time_start<CONVERT(VARCHAR,@date_end,108))
sql server 函数介绍-日期类            
+CASE 
sql server 函数介绍-日期类                
WHEN DATEDIFF(Day,@date_begin,@date_end)>1 
sql server 函数介绍-日期类                
THEN (DATEDIFF(Day,@date_begin,@date_end)-1)
sql server 函数介绍-日期类                    
*(SELECT SUM(worktime) FROM tb_worktime)
sql server 函数介绍-日期类                
ELSE 0 END
sql server 函数介绍-日期类    
RETURN(@worktime)
sql server 函数介绍-日期类
END
sql server 函数介绍-日期类

13、复杂年月处理
sql server 函数介绍-日期类--定义基本数字表
sql server 函数介绍-日期类
declare @T1 table(代码 int,名称 varchar(10),参加时间 datetime,终止时间 datetime)
sql server 函数介绍-日期类
insert into @T1
sql server 函数介绍-日期类    
select 12,'单位1','2003/04/01','2004/05/01'
sql server 函数介绍-日期类    
union all select 22,'单位2','2001/02/01','2003/02/01'
sql server 函数介绍-日期类    
union all select 42,'单位3','2000/04/01','2003/05/01'
sql server 函数介绍-日期类    
union all select 25,'单位5','2003/04/01','2003/05/01'
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--定义年表
sql server 函数介绍-日期类
declare @NB table(代码 int,名称 varchar(10),年份 int)
sql server 函数介绍-日期类
insert into @NB
sql server 函数介绍-日期类    
select 12,'单位1',2003
sql server 函数介绍-日期类    
union all select 12,'单位1',2004
sql server 函数介绍-日期类    
union all select 22,'单位2',2001
sql server 函数介绍-日期类    
union all select 22,'单位2',2002
sql server 函数介绍-日期类    
union all select 22,'单位2',2003
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--定义月表
sql server 函数介绍-日期类
declare @YB table(代码 int,名称 varchar(10),年份 int,月份 varchar(2))
sql server 函数介绍-日期类
insert into @YB
sql server 函数介绍-日期类    
select 12,'单位1',2003,'04'
sql server 函数介绍-日期类    
union all select 22,'单位2',2001,'01'
sql server 函数介绍-日期类    
union all select 22,'单位2',2001,'12'
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--为年表+月表数据处理准备临时表
sql server 函数介绍-日期类
select top 8246 y=identity(int,1753,1)
sql server 函数介绍-日期类
into #tby from
sql server 函数介绍-日期类    (
select id from syscolumns) a,
sql server 函数介绍-日期类    (
select id from syscolumns) b,
sql server 函数介绍-日期类    (
select id from syscolumns) c
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--为月表数据处理准备临时表
sql server 函数介绍-日期类
select top 12 m=identity(int,1,1)
sql server 函数介绍-日期类
into #tbm from syscolumns
sql server 函数介绍-日期类
 #tby,#tbm

14、 交叉表
sql server 函数介绍-日期类--示例
sql server 函数介绍-日期类

sql server 函数介绍-日期类
--示例数据
sql server 函数介绍-日期类
create table tb(ID int,Time datetime)
sql server 函数介绍-日期类
insert tb select 1,'2005/01/24 16:20'
sql server 函数介绍-日期类
union all select 2,'2005/01/23 22:45'
sql server 函数介绍-日期类
union all select 3,'2005/01/23 0:30'
sql server 函数介绍-日期类
union all select 4,'2005/01/21 4:28'
sql server 函数介绍-日期类
union all select 5,'2005/01/20 13:22'
sql server 函数介绍-日期类
union all select 6,'2005/01/19 20:30'
sql server 函数介绍-日期类
union all select 7,'2005/01/19 18:23'
sql server 函数介绍-日期类
union all select 8,'2005/01/18 9:14'
sql server 函数介绍-日期类
union all select 9,'2005/01/18 18:04'
sql server 函数介绍-日期类
go
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--查询处理:
sql server 函数介绍-日期类
select     case when grouping(b.Time)=1 then 'Total' else b.Time end,
sql server 函数介绍-日期类    
[Mon]=sum(case a.week when 1 then 1 else 0 end),
sql server 函数介绍-日期类    
[Tue]=sum(case a.week when 2 then 1 else 0 end),
sql server 函数介绍-日期类    
[Wed]=sum(case a.week when 3 then 1 else 0 end),
sql server 函数介绍-日期类    
[Thu]=sum(case a.week when 4 then 1 else 0 end),
sql server 函数介绍-日期类    
[Fri]=sum(case a.week when 5 then 1 else 0 end),
sql server 函数介绍-日期类    
[Sat]=sum(case a.week when 6 then 1 else 0 end),
sql server 函数介绍-日期类    
[Sun]=sum(case a.week when 0 then 1 else 0 end),
sql server 函数介绍-日期类    
[Total]=count(a.week)
sql server 函数介绍-日期类
from(
sql server 函数介绍-日期类    
select Time=convert(char(5),dateadd(hour,-1,Time),108)
sql server 函数介绍-日期类            
--时间交界点是1am,所以减1小时,避免进行跨天处理
sql server 函数介绍-日期类
        ,week=(@@datefirst+datepart(weekday,Time)-1)%7
sql server 函数介绍-日期类            
--考虑@@datefirst对datepart的影响
sql server 函数介绍-日期类
    from tb
sql server 函数介绍-日期类)a 
right join(
sql server 函数介绍-日期类    
select id=1,a='16:00',b='19:59',Time='[5pm - 9pm)' union all
sql server 函数介绍-日期类    
select id=2,a='20:00',b='23:59',Time='[9pm - 1am)' union all
sql server 函数介绍-日期类    
select id=3,a='00:00',b='02:59',Time='[1am - 4am)' union all
sql server 函数介绍-日期类    
select id=4,a='03:00',b='07:29',Time='[4am - 8:30am)' union all
sql server 函数介绍-日期类    
select id=5,a='07:30',b='11:59',Time='[8:30am - 1pm)' union all
sql server 函数介绍-日期类    
select id=6,a='12:00',b='15:59',Time='[1pm - 5pm)'
sql server 函数介绍-日期类)b 
on a.Time>=b.a and a.Time<b.b
sql server 函数介绍-日期类
group by b.id,b.Time with rollup
sql server 函数介绍-日期类
having grouping(b.Time)=0 or grouping(b.id)=1
sql server 函数介绍-日期类
go
sql server 函数介绍-日期类
sql server 函数介绍-日期类
--删除测试
sql server 函数介绍-日期类
drop table tb
sql server 函数介绍-日期类
*/

15、任意两个时间之间的星期几的次数-横
sql server 函数介绍-日期类if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_weekdaycount]'and xtype in (N'FN', N'IF', N'TF'))
sql server 函数介绍-日期类
drop function [dbo].[f_weekdaycount]
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类

16、任意两个时间之间的星期几的次数-纵
sql server 函数介绍-日期类if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_weekdaycount]'and xtype in (N'FN', N'IF', N'TF'))
sql server 函数介绍-日期类
drop function [dbo].[f_weekdaycount]
sql server 函数介绍-日期类
GO
sql server 函数介绍-日期类

17、统计--交叉表+日期+优先
sql server 函数介绍-日期类--交叉表,根据优先级取数据,日期处理
sql server 函数介绍-日期类

sql server 函数介绍-日期类
create table tb(qid int,rid nvarchar(4),tagname nvarchar(10),starttime smalldatetime,endtime smalldatetime,startweekday int,endweekday int,startdate smalldatetime,enddate smalldatetime,d int)
sql server 函数介绍-日期类
insert tb select 1,'A1','未订','08:00','09:00',1   ,5   ,null       ,null       ,1
sql server 函数介绍-日期类
union all select 1,'A1','未订','09:00','10:00',1   ,5   ,null       ,null       ,1
sql server 函数介绍-日期类
union all select 1,'A1','未订','10:00','11:00',1   ,5   ,null       ,null       ,1
sql server 函数介绍-日期类
union all select 1,'A1','装修','08:00','09:00',null,null,'2005-1-18','2005-1-19',2 
sql server 函数介绍-日期类
--union all select 1,'A1','装修','09:00','10:00',null,null,'2005-1-18','2005-1-19',2
sql server 函数介绍-日期类
union all select 1,'A1','装修','10:00','11:00',null,null,'2005-1-18','2005-1-19',2
sql server 函数介绍-日期类
union all select 1,'A2','未订','08:00','09:00',1   ,5   ,null       ,null       ,1
sql server 函数介绍-日期类
union all select 1,'A2','未订','09:00','10:00',1   ,5   ,null       ,null       ,1
sql server 函数介绍-日期类
union all select 1,'A2','未订','10:00','11:00',1   ,5   ,null       ,null       ,1
sql server 函数介绍-日期类
--union all select 1,'A2','装修','08:00','09:00',null,null,'2005-1-18','2005-1-19',2
sql server 函数介绍-日期类
union all select 1,'A2','装修','09:00','10:00',null,null,'2005-1-18','2005-1-19',2
sql server 函数介绍-日期类
--union all select 1,'A2','装修','10:00','11:00',null,null,'2005-1-18','2005-1-19',2
sql server 函数介绍-日期类
go
sql server 函数介绍-日期类
*/

相关文章: