`
yysct2005
  • 浏览: 90625 次
  • 性别: 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中进行时间日期的操作。 ### 一、...

    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 ...

    SQL Server时间算法

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

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

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

    sql server2019安装包

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

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

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

    sqlserver驱动2012版

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

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

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

    sql server基本图标

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

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

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

    sqlserver 计算数据库时间差

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

    sql server 中进行des加密

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

    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