问题:
  在数据库编程开发中,有时需要获取一年前的日期,以便以此为时间的分界点,查询其前后对应的数据量。例如:
1. 想查询截止到一年前当天0点之前的数据量,以及一年前当天0点开始到现在的数据量。
2. 想查询截止到一年前当天24点之前的数据量,以及一年前当天24点开始到现在的数据量。
3. 想查询截止到一年前当月1日0点之前的数据量,以及一年前当月1日0点开始到现在的数据量。
4. 想查询截止到一年前当月最后一天24点之前的数据量,以及一年前当月最后一天24点开始到现在的数据量。
  以上这四种情况的具体查询场景,有archive数据脚本开发之前对数据库数据量的分布情况进行统计等,也有根据当前日期动态计算一年来的增量增幅情况等。
  如果每次接到这样的需求需要获取一年前日期,然后每次重新思考怎么去实现肯定是不明智的,或者说公司内已经有人写了脚本实现,但其他同事遇到相同的问题,又重新构思一次,这样就比较浪费时间和精力,耗在这个细节上一些精力,有点像要做饭可是没有米就要先去买米的感觉,而且容易造成不同人写的脚本不统一,不利于代码规范化标准化的原则,不同的人跟进的时候还要去想想之前的人写的是什么逻辑。而且重新开发脚本的话,又需要重新进行自测,不利于提高工作效率。

解决方案:
首先简单介绍一下基本的知识点:
getdate()是获取当前日期;
dateadd可以对日期进行增减,在这里用来对年份减少1【dateadd(year, -1, 日期字符串)】,也可以用来对月份增加1【dateadd(month, 1, 日期字符串)】;
convert可以对日期进行字符串截取转换操作,在这里可以只截取形如2019-07-17的年月日【convert(varchar(10), 日期字符串, 120))】,也可以只截取形如2019-07的年月部分【convert(varchar(7), 日期字符串, 120))】。
然后就是针对上面4个问题对应的4个解决方法:
1. 最简单,对当前日期进行减少1年的运算,然后只截取年月日。
2. 先对当前日期进行增加1天的运算,然后再减少1年,最后只截取年月日。
3. 先对当前日期进行截取年月操作,然后再指定为当月01日,再减少1年,最后只截取年月日。
4. 先对当前日期进行截取年月操作,然后再指定为当月01日,再减少1年,并加上1个月,最后只截取年月日。
最后就可以直接在查询脚本条件中使用这个时间节点:
查询统计时间节点之前:select count(*) from 表 where 时间字段 < @datePoint
查询统计时间节点开始到现在:select count(*) from 表 where 时间字段 >= @datePoint

脚本:

/*
功能:获取一年前日期
作者:zhang502219048
脚本来源:https://www.cnblogs.com/zhang502219048/p/11198789.html
*/ --1.截止到一年前当天0点
declare @datePoint datetime = convert(varchar(10), dateadd(year, -1, getdate()), 120)
select @datePoint as DatePoint
go --2.截止到一年前当天24点
declare @datePoint datetime = convert(varchar(10), dateadd(year, -1, dateadd(day, 1, getdate())), 120)
select @datePoint as DatePoint
go --3.截止到一年前当月1日0点
declare @datePoint datetime = convert(varchar(10), dateadd(year, -1, convert(varchar(7), getdate(), 120) + '-01'), 120)
select @datePoint as DatePoint
go --4.截止到一年前当月最后一天24点
declare @datePoint datetime = convert(varchar(10), dateadd(month, 1, dateadd(year, -1, convert(varchar(7), getdate(), 120) + '-01')), 120)
select @datePoint as DatePoint
go

脚本运行结果:
 
总结:
博主在这里就为大家分享了自己在工作过程中所编写的生成一年前日期数据库脚本的方法,如果你也需要可以直接拿来主义应用到实际工作中而不用进行重复构思编程。 

sql server编写通用脚本实现获取一年前日期的方法的更多相关文章

  1. sql server编写通用脚本自动统计各表数据量心得

    工作过程中,如果一个数据库的表比较多,手工编写统计脚本就会比较繁琐,于是摸索出自动生成各表统计数据量脚本的通用方法,直接上代码: /* 脚本来源:https://www.cnblogs.com/zha ...

  2. sql server编写通用脚本自动检查两个不同服务器的新旧数据库的表结构差异

    问题:工作过程中,不管是什么项目,伴随着项目不断升级版本,对应的项目数据库业务版本也不断升级,数据库出现新增表.修改表.删除表.新增字段.修改字段.删除字段等变化,如果人工检查,数据库表和字段比较多的 ...

  3. sql server编写简洁四则运算表达式脚本实现计算批次功能(C#等其它编程语言也能直接用此通用表达式)

    问题: 在数据库编程开发中,有时会遇到数据量比较大的情况,如果直接大批量进行添加数据.修改数据.删除数据,就会是比较大的事务,事务日志也比较大,耗时久的话会对正常操作造成一定的阻塞.虽不至于达到删库跑 ...

  4. SQL Server中通用数据库角色权限处理

    SQL Server中通用数据库角色权限处理   最近和同事在做数据库权限清理的事情,主要是删除一些账号:取消一些账号的较大的权限等,例如,有一些有db_owner权限,我们取消账号的数据库角色db_ ...

  5. SQL Server中通用数据库角色权限的处理详解

    SQL Server中通用数据库角色权限的处理详解 前言 安全性是所有数据库管理系统的一个重要特征.理解安全性问题是理解数据库管理系统安全性机制的前提. 最近和同事在做数据库权限清理的事情,主要是删除 ...

  6. SQL Server中的CLR编程——用.NET为SQL Server编写存储过程和函数

    原文:SQL Server中的CLR编程--用.NET为SQL Server编写存储过程和函数 很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之 ...

  7. SQL Server服务器名称与默认实例名不一致的修复方法

    SQL Server服务器名称与默认实例名不一致的修复方法 分类: 个人累积 SQl SERVER 数据库复制2011-08-10 09:49 10157人阅读 评论(0) 收藏 举报 sql ser ...

  8. SQL Server中查询用户的对象权限和角色的方法

    --SQL Server中查询用户的对象权限和角色的方法 -- 查询用户的object权限 exec sp_helprotect NULL, 'sa' -- 查询用户拥有的role exec sp_h ...

  9. SQL Server远程连接 provider: Named Pipes Provider, error: 40 解决方法

    置SQLServer,允许远程连接 按照上面的文章一步步配置后,远程连接出现下面所示的报错(Navicat 和 SQL Server Management Studio) SQL Server Man ...

随机推荐

  1. VS2013环境里安装QT插件-“X86”与目标计算机类型“x64”冲突

    在VS2013环境里搭载QT老是出现模块计算机类型“X86”与目标计算机类型“x64”冲突 2.解决方案2.1 项目右键,属性>配置管理选择>x64,没有的话新建:2.2  项目右键,属性 ...

  2. SqlServer 无法为可更新的订阅设置发布服务器登录名 sp_link_publication

    原文:SqlServer 无法为可更新的订阅设置发布服务器登录名 sp_link_publication 没有截图: 创建可更新订阅,正常创建了发布,在订阅端创建订阅,最后一步提示完成,却出现了警告: ...

  3. RDLC报表 分组排序设置

    原文:RDLC分组排序设置 RDLC中反复设置表的排序字段,设置数据源排序后绑定均无效. 需要在分组字段右击组属性中,修改对应的排序字段,即可.

  4. SQLServer2005数据库快照的简单使用

    原文:SQLServer2005数据库快照的简单使用                                                  SQLServer2005数据库快照的简单使用 ...

  5. C#判断系统是32位还是64位

    bool type; type = Environment.Is64BitOperatingSystem; Console.WriteLine(type);

  6. Win32 Application基本框架

    //程序入口 intAPIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdSh ...

  7. 瑞芯微RK3399宣布系统开源,进入百余种行业市场!

    集微网消息,2月24日瑞芯微官方突然宣布, Rockchip RK3399Linux系统开源!作为Rockchip旗舰级芯片,RK3399具有高性能.高扩展.全能型应用特性. 这一重磅消息立马刷爆朋友 ...

  8. MQTT-CN MQTT协议中文版

    欢迎任何形式的转载,但请务必注明出处:http://www.cnblogs.com/liangjingyang 项目地址:https://github.com/liangjingyang/MQTT-C ...

  9. Windows Python虚拟环境配置(Distribute + pip + virtualenv + virtualenvwrapper-powershell)

    对于Python开发新手,很多人会迷茫那些各种名目的工具和概念,如Python2.7, Python3.3, Distribute, pip, virtualenv,Setuptools, easy_ ...

  10. SYN4505型 标准同步时钟

    SYN4505型 标准同步时钟 标准同步时钟电厂时间同步使用说明视频链接: http://www.syn029.com/h-pd-245-0_310_1_-1.html 请将此链接复制到浏览器打开观看 ...