`

关于SQLServer2005的学习笔记——生日问题

 
阅读更多

生日问题是个看似简单逻辑上却又比较复杂的小问题

主要的逻辑难点第一个是关于闰月尾天的计算,第二个是判断本年度生日是否已过

本文给出了三种解决办法,

第一种是最常用的解决办法,即常用的 SQL 语法,不过看起来比较复杂,适合环境为 SQLServer2000 以上

第二种是采用函数的方法,把对日期的逻辑处理放到函数中,调用起来会简约一下,适合环境为 SQLServer2000 以上

第三种是采用 CTE 的方法,用 CTE 来封装判断逻辑,适合环境为 SQLServer2005 以上

-- 创建表和数据

CREATE TABLE employees

(

name VARCHAR(50),

birthday DATETIME

)

INSERT INTO employees VALUES('WBQ','1948-12-08');

INSERT INTO employees VALUES('CZH','1952-02-19');

INSERT INTO employees VALUES('LB','1963-08-30');

INSERT INTO employees VALUES('YLL','1937-09-19');

INSERT INTO employees VALUES('YGQ','1955-03-04');

INSERT INTO employees VALUES('CHH','1963-07-02');

INSERT INTO employees VALUES('SWG','1960-05-29');

INSERT INTO employees VALUES('HW','1958-01-01');

INSERT INTO employees VALUES('YY','1972-02-29');

INSERT INTO employees VALUES('LM','1999-02-08');

INSERT INTO employees VALUES('ZY','1972-06-09');

INSERT INTO employees VALUES('WZH','1999-02-28');

SELECT name,birthday FROM employees

-- 普通的 SQL 实现

SELECT

name,

birthday,

GETDATE() getdate,

CONVERT(VARCHAR(10),GETDATE(),120) todayVarchar,

CONVERT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120)) todayDateTime,

DATEDIFF(YY,birthday,GETDATE()) DateBetween,

DATEADD(YY,DATEDIFF(YY,birthday,GETDATE()),birthday) ThisBirthday,

DATEADD(YY,DATEDIFF(YY,birthday,GETDATE())+1,birthday) NextBirthday,

CASE WHEN CONVERT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120))>DATEADD(YY,DATEDIFF(YY,birthday,GETDATE()),birthday)

THEN DATEADD(YY,DATEDIFF(YY,birthday,GETDATE())+1,birthday)

ELSE DATEADD(YY,DATEDIFF(YY,birthday,GETDATE()),birthday)

END newBirthdayStandard,

CASE WHEN CONVERT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120))>DATEADD(YY,DATEDIFF(YY,birthday,GETDATE()),birthday)

THEN DATEADD(YY,DATEDIFF(YY,birthday,GETDATE())+1,birthday)+

CASE WHEN DAY(birthday)=29 AND DAY(DATEADD(YY,DATEDIFF(YY,birthday,GETDATE())+1,birthday))=28 THEN 1 ELSE 0 END

ELSE DATEADD(YY,DATEDIFF(YY,birthday,GETDATE()),birthday) +

CASE WHEN DAY(birthday)=29 AND DAY(DATEADD(YY,DATEDIFF(YY,birthday,GETDATE()),birthday))=28 THEN 1 ELSE 0 END

END newBirthdayForeign

FROM employees

-- 使用函数来实现

CREATE FUNCTION GetBirthday(@birthday DATETIME,@flag INT)

RETURNS DATETIME

AS

BEGIN

DECLARE @BirthdayRet DATETIME,@BirthdayThis DATETIME,@BirthdayNext DATETIME,@today DATETIME,@dateBetween INT

SET @today=CONVERT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120))

SET @dateBetween=DATEDIFF(YY,@birthday,GETDATE())

SET @BirthdayThis=DATEADD(YY,@DateBetween,@birthday)

SET @BirthdayNext=DATEADD(YY,@DateBetween+1,@birthday)

IF @flag=1 --2 29 日的生日计算为 2 28

BEGIN

IF @today>@BirthdayThis

SET @BirthdayRet=@BirthdayNext

ELSE

SET @BirthdayRet=@BirthdayThis

END

ELSE --2 29 日的生日计算为 3 1

BEGIN

IF @today>@BirthdayThis

IF DAY(@birthday)=29 AND DAY(@BirthdayNext)=28

SET @BirthdayRet=@BirthdayNext+1

ELSE

SET @BirthdayRet=@BirthdayNext

ELSE

IF DAY(@birthday)=29 AND DAY(@BirthdayThis)=28

SET @BirthdayRet=@BirthdayThis+1

ELSE

SET @BirthdayRet=@BirthdayThis END

RETURN @BirthdayRet

END

SELECT name,birthday,dbo.GetBirthday(birthday,0),dbo.GetBirthday(birthday,1) FROM employees

-- 通过 CTE 来实现

WITH DateBetween AS

(

SELECT

name,

birthday,

GETDATE() getdate,

CONVERT(VARCHAR(10),GETDATE(),120) todayVarchar,

CONVERT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120)) todayDateTime,

DATEDIFF(YY,birthday,GETDATE()) DateBetween

FROM employees

),

DateBirthdayThisAndNext AS

(

SELECT

name,birthday,getdate,todaydatetime,datebetween,

DATEADD(YY,DateBetween,birthday) AS DateCur,

DATEADD(YY,DateBetween+1,birthday) AS DateNext

FROM DateBetween

),

DateBirthdayThisAndNextForeign AS

(

SELECT

name,birthday,todaydatetime,

DateCur,DateNext,

DateCur+CASE WHEN DAY(birthday)=29 AND DAY(DateCur)=28 THEN 1 ELSE 0 END AS DateCurForeign,

DateNext+CASE WHEN DAY(birthday)=29 AND DAY(DateNext)=28 THEN 1 ELSE 0 END AS DateNextForeign

FROM DateBirthdayThisAndNext

),

DateBirthday AS

(

SELECT

name,birthday,

CASE WHEN DateCurForeign>=todaydatetime THEN DateCurForeign ELSE DateNextForeign END AS birthDayForeign,

CASE WHEN DateCur>=todaydatetime THEN DateCur ELSE DateNext END AS birthDayStandard

FROM DateBirthdayThisAndNextForeign

)

SELECT name,birthday,birthDayForeign,birthDayStandard FROM DateBirthday

分享到:
评论

相关推荐

    SQLServer2005_BC_x64补丁 ,SQLServer2005_BC 32位补丁

    本压缩包包含了针对32位和64位系统的两个补丁:SQLServer2005_BC.msi 和 SQLServer2005_BC_x64.msi,主要目的是为了提升SQL Server 2005 Business Intelligence (BI)组件的兼容性和性能。 SQL Server 2005 Business...

    SQLserver2008学习笔记

    SQL server 2008

    SQLServer2005数据库学习笔记

    笔记是本人学习SQLServer一段时间后重新整理出来的,适合有一些入门基础的人学习。 ├─01 安装及使用 │ SQLServer2005安装及使用.txt │ ├─02 常用函数 │ function.sql │ ├─03 建表、建库 │ create.sql ...

    SQL SERVER 2008 学习笔记:日常维护、深入管理、性能优化.part1/2

    SQL SERVER 2008 学习笔记:日常维护、深入管理、性能优化。

    SQL Server 2005学习笔记

    总的来说,SQL Server 2005的学习笔记涵盖了数据库创建、表结构设计、约束管理和身份验证模式设置等核心概念,这些都是数据库管理及开发的基础。通过深入理解和实践这些知识点,能帮助初学者建立起对SQL Server...

    c#版VS2005@MS SQL SERVER2005典型应用——通讯录

    《C#版VS2005与MS SQL SERVER2005在通讯录应用中的典型实践》 在信息技术领域,编程语言与数据库系统的结合是构建应用程序的基础。本资源以C#编程语言和Microsoft Visual Studio 2005(VS2005)为开发环境,配合SQL...

    SQLServer2012王者归来——基础、安全、开发及性能优化

    资源名称:SQL Server 2012王者归来——基础、安全、开发及性能优化内容简介:本书由浅入深,全面细致地讲述了SQL Server 2012的功能特性和开发应用。从SQL Server数据库基础到数据库安全,再到SQL Server开发及...

    SQL Server2005 SP4

    这两个文件名——"sqlserver2005sp4-kb2463332-x64-chs_0473159bb4dec7f4e17f3fc152de5e8945d3e3cc.exe"和"sqlserver2005sp4-kb2463332-x86-chs_48ab3b127c355ef499b7ef8630b130868298d891.exe",分别对应了这两个...

    SQL server2005笔记

    SQLserver 数据库学习笔记 欢迎大家下载学习,共同进步啊

    Sql Server——Sql性能优化

    Sql Server——Sql性能优化Sql Server——Sql性能优化Sql Server——Sql性能优化Sql Server——Sql性能优化Sql Server——Sql性能优化Sql Server——Sql性能优化Sql Server——Sql性能优化Sql Server——Sql性能优化

    《数据挖掘原理与应用——SQL Server 2005 数据库》算法案例

    《数据挖掘原理与应用——SQL Server 2005 数据库》是一本深入探讨数据挖掘技术的书籍,其中包含了丰富的算法实例,旨在帮助读者理解并掌握如何在SQL Server 2005环境下进行数据挖掘实践。数据挖掘是利用统计学、...

    SqlServer2005 打开 SqlServer2008 mdf文件

    Sql Server 2005 打开 Sql Server 2008 mdf 文件数据库转换是指将 Sql Server 2008 中的数据库文件(mdf 文件)转换为 Sql Server 2005 可以识别的格式,以便在 Sql Server 2005 中使用。这种转换过程需要使用 Sql ...

    Microsoft SQL Server 2005 向后兼容组件

    Microsoft SQL Server 2005 Backward Compatibility Components (Microsoft SQL Server 2005 向后兼容组件) SQL Server Backward Compatibility 包中包含 最新版本的 Data Transformation Services 2000 运行时 ...

    SQL Server 2005数据库实践教程——开发与设计篇-电子教案

    《SQL Server 2005数据库实践教程——开发与设计篇》是一份全面介绍SQL Server 2005数据库系统使用的电子教案。这份教程共分为7个章节,旨在帮助学习者掌握SQL Server 2005的核心概念、功能以及实际应用技巧。下面,...

    连接SQL SERVER 2005/2008失败——解决方案

    连接SQL SERVER 2005/2008失败——解决方案

    Microsoft SQL Server 2005 向后兼容组件 [免费版]

    Microsoft SQL Server 2005 Backward Compatibility Components (Microsoft SQL Server 2005 向后兼容组件) SQL Server Backward Compatibility 包中包含最新版本的 Data Transformation Services 2000 运行时 (DTS...

    SQLServer2005客户端SQLServer2005_SSMSEE.msi

    "SQLServer2005_SSMSEE.msi" 文件就是SQL Server 2005的System Management Studio Express(SSMSEE)的安装程序,这是一个简化版的SQL Server Management Studio,专为开发者和小型团队设计,提供基础的数据库管理和...

    数据库技术及应用——SQL Server 2005-电子教案

    总的来说,《数据库技术及应用——SQL Server 2005》电子教案将带领学习者全面探索SQL Server 2005的世界,从基础操作到高级技术,从理论知识到实践技能,旨在培养出能够熟练运用SQL Server 2005解决实际问题的专业...

    sqlserver 2005 express X64

    - 免费:SQL Server 2005 Express是微软提供的一款免费数据库产品,适合学习和开发用途。 - 小型数据库:适用于存储和管理中小规模的数据,最大数据库大小为4GB。 - 强大的查询引擎:支持T-SQL语言,具备复杂查询...

    郝斌老师SqlServer 2005上课学习笔记大纲

    郝斌老师SqlServer 2005上课学习笔记大纲

Global site tag (gtag.js) - Google Analytics