`
yysct2005
  • 浏览: 91859 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

SQL Server 中的时间算法总结

    博客分类:
  • JDBC
阅读更多
DECLARE @Date DATETIME SET @Date = GETDATE () -- 前一天,给定日期的前一天 SELECT DATEADD ( DAY , - 1 , @Date ) AS 前一天 -- 后一天,给定日期的后一天 SELECT DATEADD ( DAY , 1 , @Date ) AS 后一天 GO -- 月初,计算给定日期所在月的第一天 -- 这
 

DECLARE @Date  DATETIME
SET @Date=GETDATE()
--前一天,给定日期的前一天
SELECT DATEADD(DAY,-1,@Date) AS 前一天
--后一天,给定日期的后一天
SELECT DATEADD(DAY,1,@Date) AS 后一天
GO


--月初,计算给定日期所在月的第一天
--
这个计算的技巧是先计算当前日期到“1900-01-01”的时间间隔数,然后把它加到“1900-01-01”上来获得特殊的日期,这个技巧可以用---来计算很多不同的日期。
DECLARE @Date  DATETIME
SET @Date=GETDATE()
SELECT DATEADD(MONTH,DATEDIFF(MONTH,1900-01-01,@Date),1900-01-01) AS 所在月的第一天
--精简算法,根据SQL Server的时间表示方式可知,1900-01-01 可以用0代替
SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0) AS 所在月的第一天
--上面两种算法精确到天 时分秒均为00:00:00.000
--
下面算法课以保留时分秒
--
思路:用给定日期减去月第一天与给定日期差的天数
SELECT DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)
GO

--月末,计算给定日期所在月的最后一天
DECLARE @Date  DATETIME
SET @Date=GETDATE()
--思路:当前月的下一月1号在减1天
SELECT DATEADD(DAY,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,1900-01-01,@Date),1900-01-01)) AS 所在月的最一天
SELECT DATEADD(MONTH,1+DATEDIFF(MONTH,1900-01-01,@Date),1900-01-01)-1 AS 所在月的最一天
--1900-01-01 用0代替
SELECT DATEADD(DAY,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0)) AS 所在月的最一天
SELECT DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0)-1 AS 所在月的最一天
--思路:与月初计算思路相同
SELECT DATEADD(MONTH,DATEDIFF(MONTH,1989-12-31,@Date),1989-12-31) AS 所在月的最一天
--精简算法,1989-12-31 用-1代替
SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date),-1) AS 所在月的最一天
--保留时分秒的算法
SELECT DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)))
GO

--其他月计算

--计算给定日期所在月的上月第一天
DECLARE @Date  DATETIME
SET @Date=GETDATE()
--当前月第一天减去一个月
SELECT DATEADD(MONTH,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS 上月第一天
--简化
SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)-1,0) AS 上月第一天
--另一种当前月第一天算法
SELECT DATEADD(MONTH,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) 上月第一天
GO

--计算给定日期所在月的上月最后一天
DECLARE @Date  DATETIME
SET @Date=GETDATE()
--当前月第一天减去一天
SELECT DATEADD(DAY,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS 上月最后一天
--另一种当前月第一天算法
SELECT DATEADD(DAY,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) 上月最后一天
SELECT DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)-1 上月最后一天
--另一种算法,不能用当前月的最后一天加一个月,因为当前月可能是30天。
--
例如 SELECT DATEADD(MONTH,1,2010-06-30) --结果是2010-07-30而不是2010-07-31,
--
这也是月末算法采用下月第一天减1天计算的原因
--
但是如果计算月是31天择无此问题
--
例如 SELECT DATEADD(MONTH,1,2010-05-31) --结果是2010-06-30
--
因此下面算法是正确的,-1 表示1899-12-31 00:00:00.000-- SELECT CONVERT(DATETIME,-1)
SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date)-1,-1)
--另一种当前月算法
SELECT DATEADD(DAY,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) 上月最后一天
--简化
SELECT DATEADD(DAY,0-DATEPART(DAY,@Date),@Date) 上月最后一天
GO

--计算给定日期所在月的下月第一天
DECLARE @Date  DATETIME
SET @Date=GETDATE()
--当前月第一天加一个月
SELECT DATEADD(MONTH,1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS 下月第一天
--简化
SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+1,0) AS 下月第一天
--另一种当前月第一天算法
SELECT DATEADD(MONTH,1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) 下月第一天
GO

--计算给定日期所在月的下月最后一天
DECLARE @Date  DATETIME
SET @Date=GETDATE()
--当前月第一天加2个月再减去1天
SELECT DATEADD(DAY,-1,DATEADD(MONTH,2,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0))) AS 下月最后一天
--简化
SELECT DATEADD(DAY,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+2,0)) AS 下月最后一天
SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+2,0)-1 AS 下月最后一天
--另一种算法
SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date)+1,-1) 下月最后一天
--另一种当前月第一天算法
SELECT DATEADD(DAY,-1,DATEADD(MONTH,2,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date))) 下月最后一天
GO

--所在星期的第一天,计算给定日期所在星期的第1天(星期日为第一天)
DECLARE @Date  DATETIME
SET @Date= GETDATE()
--与SQL Server语言版本相关的算法
--
思路:当前日期+星期日(每周的第1天)与当前日期的差的天数
--
DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)
SELECT DATEADD(WEEKDAY,1-DATEPART(WEEKDAY,@Date),@Date) AS 所在星期的第一天,星期日
--星期日,与SQL Server语言版本或@@DATEFIRST无关
--
1989-12-31 是星期日,1989-12-31 再加上(当前日期与1989-12-31差的星期数)个星期
SELECT DATEADD(WEEK,DATEDIFF(WEEK,-1,@Date),-1) AS 所在星期的星期日
--或者
SELECT DATEADD(WEEK,DATEDIFF(WEEK,6,@Date),6) AS 所在星期的星期日
GO


--所在星期的第二天,计算给定日期所在星期的第2天(星期日为第一天)
DECLARE @Date  DATETIME
SET @Date= GETDATE()
--思路:当前日期+星期一(每周的第2天)与当前日期的差的天数
--
DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)
SELECT DATEADD(DAY,2-DATEPART(WEEKDAY,@Date),@Date) AS 所在星期的第二天,星期一
--星期一,与SQL Server语言版本或@@DATEFIRST无关
--
1900-01-01 是星期一,1900-01-01 再加上(当前日期与1900-01-01差的星期数)个星期
SELECT DATEADD(WEEK,DATEDIFF(WEEK,0,@Date),0) AS 所在星期的星期一
GO

--上个星期第一天,计算给定日期所在星期的上一个星期日(星期日为第一天)
DECLARE @Date  DATETIME
SET @Date= GETDATE()
--思路:当前日志所在星期的星期日再减1周
--
DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)
SELECT DATEADD(WEEK,-1,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS 上个星期第一天,星期日
--一周等于7天
SELECT DATEADD(DAY,-7,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS 上个星期第一天,星期日
--简化
SELECT DATEADD(DAY,-6-DATEPART(WEEKDAY,@Date),@Date) AS 上个星期第一天,星期日
--上个星期日,与SQL Server语言版本或@@DATEFIRST无关
SELECT DATEADD(WEEK,-1+DATEDIFF(WEEK,-1,@Date),-1) AS 上个星期日
--或者
SELECT DATEADD(WEEK,DATEDIFF(WEEK,6,@Date),-1) AS 上个星期日
GO


--下个星期第一天,计算给定日期所在星期的下一个星期日(星期日为第一天)
DECLARE @Date  DATETIME
SET @Date= GETDATE()
--思路:当前日志所在星期的星期日再加1周
--
DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)
SELECT DATEADD(WEEK,1,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS 下个星期第一天,星期日
--一周等于7天
SELECT DATEADD(DAY,7,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS 下个星期第一天,星期日
--简化
SELECT DATEADD(DAY,8-DATEPART(WEEKDAY,@Date),@Date) AS 下个星期第一天,星期日
--下个星期日,与SQL Server语言版本或@@DATEFIRST无关
SELECT DATEADD(WEEK,1+DATEDIFF(WEEK,-1,@Date),-1) AS 下个星期日
--或者
SELECT DATEADD(WEEK,DATEDIFF(WEEK,-1,@Date),6) AS 下个星期日
GO

--判断给定日期是星期几
DECLARE @Date  DATETIME
SET @Date= GETDATE()
--DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)
SELECT DATEPART(WEEKDAY,@Date) --返回值 1-星期日,2-星期一,3-星期二......7-星期六
--
上面算法与SQL 语言版本或 @@DATEFIRST 相关
--
下面算法与SQL Server语言版本或@@DATEFIRST无关
SELECT DATENAME(WEEKDAY,@Date) 星期
GO


--年度计算
DECLARE @Date  DATETIME
SET @Date=GETDATE()
--年初,计算给定日期所在年的第一天
SELECT DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0) AS 所在年的第一天
--年末,计算给定日期所在年的最后一天
SELECT DATEADD(YEAR,DATEDIFF(YEAR,-1,@Date),-1) AS 所在年的最后一

分享到:
评论

相关推荐

    SQLServer时间处理

    在SQL Server中,时间处理是数据库管理中的一个重要环节,它涉及到如何存储、操作和查询与时间相关的数据。本文将深入探讨SQL Server中的时间处理技术,包括时间数据类型的使用、时间值的转换、以及如何获取特定时间...

    oracle与SQL server的语法差异总结

    - SQL Server中,变量声明需要 `DECLARE @code VARCHAR(5)`,赋值使用 `SET @result = 'abcd'` 或 `SELECT @code = code, @name = name FROM sysc01 WHERE id = 1000`。 6. **语句结束符**: Oracle的SQL语句以...

    sqlserver中对时间日期的操作

    在SQL Server中对时间日期的操作是数据库管理与开发过程中不可或缺的一部分。这不仅涉及到对当前时间的获取、格式化,还包括了日期的计算和调整。以下将深入解析如何在SQL Server中进行时间日期的操作。 ### 一、...

    sql server 中进行des加密

    在SQL Server中进行DES加密是保护敏感数据的一种常见方法,特别是在C#应用程序中与数据库交互时。DES(Data Encryption Standard)是一种对称加密算法,它使用相同的密钥进行加密和解密,提供了一种相对快速的数据...

    SQLServer 根据生日计算年龄

    SQLServer 根据生日计算年龄

    SQL Server中日期问题的解决

    `DateDiff`函数是SQL Server中用于计算两个日期之间的差值的一种方法。当需要判断某列中的日期是否等于特定日期时,可以使用此函数。例如,如果希望找出所有日期为2004年12月19日的数据记录,则可以使用以下SQL语句...

    ADO连接SQL_Server_2008_Express方法总结

    ### ADO连接SQL Server 2008 Express方法总结 #### 概述 在软件开发过程中,使用ADO(ActiveX Data Objects)连接SQL Server数据库是非常常见的需求之一。本文档主要介绍如何通过ADO来连接Microsoft SQL Server ...

    SQLServer时间类型日期类型.pdf

    ### SQL Server 中的日期与时间数据类型详解 #### 一、引言 在数据库操作中,日期和时间数据类型的应用非常广泛。对于SQL Server 2005及以后版本而言,理解和掌握日期/时间数据类型及其操作至关重要。本文旨在深入...

    SQL Server时间算法

    根据提供的文件信息,本文将详细解释SQL Server中的时间算法,主要关注如何利用SQL Server内置函数进行日期和时间的计算,包括获取当前日期的前一天、后一天、月初、月末等操作。 ### 获取当前日期的前一天 在SQL ...

    sql server2019安装包

    SQL Server 2019是Microsoft推出的一款关系型数据库管理系统,是SQL Server系列中的一个重要版本。它提供了强大的数据存储、处理和分析能力,广泛应用于企业级数据库应用开发和数据分析。在本安装包中,主要包含的是...

    sqlserver根据经纬度计算两点间距离

    sqlserver根据经纬度计算两点间距离sqlserver根据经纬度计算两点间距离sqlserver根据经纬度计算两点间距离sqlserver根据经纬度计算两点间距离

    sqlserver转PG经验总结及PG的一些特性

    对于日期和时间操作,可以使用 PostgreSQL 内置函数来实现 SQL Server 中的功能,例如: - `getdate()` 可以通过 `now()` 替换 - `dateadd()` 可以通过 `now() + interval` 来实现,注意如果是以参数形式传入,则...

    Sql Server 数据库超时问题的解决方法

    Sql Server 数据库超时问题的解决方法主要包括调整等待响应时间、在企业管理器中调整等待响应时间、在查询分析器中调整等待响应时间、在.NET 中调整等待响应时间等方法。通过这些方法,可以解决 Sql Server 数据库...

    sqlserver驱动2012版

    标题中的“sqlserver驱动2012版”指的是SQL Server Native Client 2012,这是微软为SQL Server设计的一款数据库访问接口。SQL Server Native Client(简称SQLNCLI)是用于与SQL Server交互的一种客户端库,它包含了...

    sql server基本图标

    总结来说,"SQL Server基本图标"是数据库管理和开发中的视觉工具,通过这些图标,用户可以更高效地理解和操作数据库。理解和掌握这些图标对于任何SQL Server用户,无论是新手还是经验丰富的专业人员,都是至关重要的...

    SQL Server的安装和配置的实验报告

    实验报告的标题为“SQL Server的安装和配置的实验报告”,描述中提到这是关于数据库的一次实验,旨在帮助读者熟悉SQL Server 2000的安装和配置过程,为后续数据库相关工作做好准备。标签包括“SQL Server”、“安装...

    sqlserver 计算数据库时间差

    sqlserver 计算数据库时间差sqlserver 计算数据库时间差sqlserver 计算数据库时间差sqlserver 计算数据库时间差sqlserver 计算数据库时间差

    sqlserver知识点总结(考试复习必备)

    SQL Server 知识点总结 SQL Server 是一种关系型数据库管理系统,由 Microsoft 开发,广泛应用于企业级数据库管理。下面是 SQL Server 知识点总结,涵盖数据库结构、创建数据库、查看数据库信息、修改数据库等方面...

    sqlserver 时间序列文档

    4. **选择算法**:在SQL Server Analysis Services中选择合适的时间序列算法,例如ARIMA或ARTXP。 5. **训练模型**:使用选定的算法对数据进行训练,生成时间序列模型。 6. **评估模型**:通过预留的数据集对模型...

Global site tag (gtag.js) - Google Analytics