NC65 计算人员离退休的天数和日期(数据库 sql server)

news2024/12/23 22:36:24

最近公司需要人力资源部需要写一张报表,计算人员距离退休的天数和日期,现附上自己写是sql脚本(仅供参考),如下:

select a.pk_psndoc,--员工信息主键
       a.code                                                                            psndoc_code,--人员编码
       a.name                                                                            psndoc_name,--人员姓名
       c.pk_psnjob,--工作信息主键
       c.clerkcode,--员工号
       a.birthdate,--出生日期
       a.age,--年龄
       case when a.sex = 1 then '男' when a.sex = 2 then '女' end                        sex,--性别
       c.pk_org,--组织主键
       d.code                                                                            org_code,--组织编码
       d.name                                                                            org_name,--组织名称
       e.pk_dept,--部门主键
       e.code                                                                            dept_code,--部门编码
       e.name                                                                            dept_name,--部门名称
       f.pk_psncl,--人员类型主键
       f.name                                                                            psncl_name,--人员类型
       h.pk_job,--职务主键
       h.jobname,--职务
       g.pk_post,--岗位主键
       g.postname,--岗位
       case when c.poststat = 'Y' then '是' else '否' end poststat,--是否在岗
       b.joinsysdate,--进入集团时间
       b.corpworkage,--集团工龄
       b.begindate,--进入日期
       b.orgglbdef3,--参加工作日期
       b.orgglbdef7,--工龄
       b.orgglbdef1,--进入报社时间
       b.orgglbdef2,--报社社龄
       case
           when a.sex = 1 then datediff(dd, GETDATE(), dateadd(yy, 60, a.birthdate))
           when a.sex = 2 then datediff(dd, GETDATE(), dateadd(yy, 55, a.birthdate)) end retire_days,--离退休天数
       convert(char(10), dateadd(dd, case
                                         when a.sex = 1 then datediff(dd, GETDATE(), dateadd(yy, 60, a.birthdate))
                                         when a.sex = 2 then datediff(dd, GETDATE(), dateadd(yy, 55, a.birthdate)) end,
                                 getdate()), 126)                                        retiredate--离退休日期
from bd_psndoc a
         inner join hi_psnorg b on a.pk_psndoc = b.pk_psndoc
         inner join hi_psnjob c on b.pk_psnorg = c.pk_psnorg
         inner join org_orgs d on c.pk_org = d.pk_org
         inner join org_dept e on c.pk_dept = e.pk_dept
         inner join bd_psncl f on c.pk_psncl = f.pk_psncl
         inner join om_job h on c.pk_job = h.pk_job
         inner join om_post g on c.pk_post = g.pk_post
where b.lastflag = 'Y'
  and b.indocflag = 'Y'
  and b.endflag = 'N'
  and b.psntype = 0
  and c.ismainjob = 'Y'
  and c.lastflag = 'Y'
  and c.endflag = 'N'

在NC65 【HR分析报表】-【分析模型-集团】节点下的sql如下:

select a.pk_psndoc,--员工信息主键
       a.code                                                                            psndoc_code,--人员编码
       a.name                                                                            psndoc_name,--人员姓名
       c.pk_psnjob,--工作信息主键
       c.clerkcode,--员工号
       a.birthdate,--出生日期
       a.age,--年龄
       case when a.sex = 1 then '男' when a.sex = 2 then '女' end                        sex,--性别
       c.pk_org,--组织主键
       d.code                                                                            org_code,--组织编码
       d.name                                                                            org_name,--组织名称
       e.pk_dept,--部门主键
       e.code                                                                            dept_code,--部门编码
       e.name                                                                            dept_name,--部门名称
       f.pk_psncl,--人员类型主键
       f.name                                                                            psncl_name,--人员类型
       h.pk_job,--职务主键
       h.jobname,--职务
       g.pk_post,--岗位主键
       g.postname,--岗位
       case when c.poststat = 'Y' then '是' else '否' end poststat,--是否在岗
       b.joinsysdate,--进入集团时间
       b.corpworkage,--集团工龄
       b.begindate,--进入日期
       b.orgglbdef3,--参加工作日期
       b.orgglbdef7,--工龄
       b.orgglbdef1,--进入报社时间
       b.orgglbdef2,--报社社龄
       a.pk_group,--集团主键
       case
           when a.sex = 1 then datediff('dd', GETDATE(), dateadd('yy', 60, a.birthdate))
           when a.sex = 2 then datediff('dd', GETDATE(), dateadd('yy', 55, a.birthdate)) end retire_days,--离退休天数
       convert(char(10), dateadd('dd', case
                                         when a.sex = 1 then datediff('dd', GETDATE(), dateadd('yy', 60, a.birthdate))
                                         when a.sex = 2 then datediff('dd', GETDATE(), dateadd('yy', 55, a.birthdate)) end,
                                 getdate()), 126)                                        retiredate--离退休日期
from bd_psndoc a
         inner join hi_psnorg b on a.pk_psndoc = b.pk_psndoc
         inner join hi_psnjob c on b.pk_psnorg = c.pk_psnorg
         inner join org_orgs d on c.pk_org = d.pk_org
         inner join org_dept e on c.pk_dept = e.pk_dept
         inner join bd_psncl f on c.pk_psncl = f.pk_psncl
         inner join om_job h on c.pk_job = h.pk_job
         inner join om_post g on c.pk_post = g.pk_post
where b.lastflag = 'Y'
  and b.indocflag = 'Y'
  and b.endflag = 'N'
  and b.psntype = 0
  and c.ismainjob = 'Y'
  and c.lastflag = 'Y'
  and c.endflag = 'N'
and a.pk_psndoc in (parameter('psndoc'))
and c.pk_org in (parameter('org')) 
and e.pk_dept in (parameter('dept')) 
and f.pk_psncl in (parameter('psncl')) 
and g.pk_post in (parameter('post')) 
and h.pk_job in (parameter('job')) 
and a.sex=parameter('sex')

and c.pk_org in (select s.pk_org from sm_user u inner join sm_user_role ur on u.cuserid=ur.cuserid
inner join sm_subject_org s on s.subjectid=ur.pk_role where u.cuserid=macro('LoginUser')) 

在这里插入图片描述

我设置了查询参数,所以sql中使用了parameter()函数,在NC的语义模型中,datediff(),datediff()间隔类型参数需要有单引号’‘引起来,但是在数据库工具执行中,则不需要单引号’'引起来。

知识延申参考:
SQL Server 日期的加减函数: DATEDIFF DATEADD

DATEDIFF: 返回跨两个指定日期的日期边界数和时间边界数, 语法:

DATEDIFF ( datepart , startdate , enddate ) 用 enddate 减去 startdate,即计算两个日期的间隔值函数: DateDiff(<间隔类型>,<日期 1>,<日期 2>[,W1][,W2])

注:datepart 指定应在日期的哪一部分计算差额的参数,其日期相减时,只关注边界值,例:

SELECT DATEDIFF(YEAR,'2008-12-31','2009-1-1')

结果返回 1

DATEADD : 返回给指定日期加上一个时间间隔后的新 datetime 值。 语法:DATEADD (datepart , number, date )

注: datepart 指定要返回新值的日期的组成部分

number 使用来增加 datepart 的值。正数表示增加,负数表示减少,如果是小数则忽略小数部分,且不做四舍五入。

通过 DATEDIFF 和 DATEADD 的一些日期计算

  1. 一年的第一天
SELECT DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE()),0)

注:首先DATEDIFF(YEAR,0,GETDATE()) --计算当前年份与 1900年相差的年数,然后通过计算1900-1-1加上相差的年数的日期即为当年第一天

  1. 一个季的第一天
SELECT DATEADD(Quarter,DATEDIFF(Quarter,0,GETDATE()),0)

注:首先DATEDIFF(Quarter,0,GETDATE()) --计算当前月份与 1900年相差的季份数,然后通过计算1900-1-1加上相差的季份数的日期即为当季第一天

  1. 一个月的第一天
SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0)

注:首先DATEDIFF(MONTH,0,GETDATE()) --计算当前月份与 1900年相差的月份数,然后通过计算1900-1-1加上相差的月份数的日期即为当月第一天

  1. 一周的第一天
SELECT DATEADD(wk,DATEDIFF(wk,0,GETDATE()),0)
  1. 当天的半夜 (00:00:00.000)
SELECT DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()),0)
  1. 上月的最后一天
SELECT DATEADD(ms,-3,DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0))

注:用本月的第一天减去3毫秒,即得出上个月的最有一天.SQL SERVER DATETIME类型的时间精确到3毫秒。

  1. 本月的最后一天
SELECT DATEADD(ms,-3,DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE())+1,0))
  1. 本月的天数

i)

SELECT DAY(DATEADD(ms,-3,DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE())+1,0)))

ii)

SELECT 32-DAY(GETDATE()+(32-DAY(GETDATE())))
  1. 本年的最后一天
SELECT DATEADD(ms,-3,DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE())+1,0))
  1. 一周的第一天
SELECT DATEADD(DAY,1-DATEPART(weekday,GETDATE()),GETDATE())

一周的最后一天

SELECT DATEADD(DAY,7-DATEPART(WeekDay,GETDATE()),GETDATE())
SELECT DATEADD(weekday,DATEDIFF(weekday,0,DATEADD(DAY,6-DATEPART(day,GETDATE()),GETDATE())),0)

日期转换函数 CONVERT CAST

CONVERT 中的 Style. 参数:108 和 114 可以只得到时间。

SELECT CONVERT(NVARCHAR(12),GETDATE(),108) ---12:41:15
SELECT CONVERT(NVARCHAR(12),GETDATE(),114) ---12:43:12:590

日期判断函数 ISDATE() 确定输入表达式是否为有效日期。若有效返回 1 否则返回 0 ,返回值为 INT 。

DATEADD日期函数
DATEADD() 函数在日期中添加或减去指定的时间间隔。

日:
在当前日期上加两天

select DATEADD(day,2,'2014-12-30') 2015-01-01
select DATEADD(dd,2,'2014-12-30')

月:
在当前日期上加两个月

select DATEADD(mm,2,'2014-12-30') 结果:2015-02-28
select DATEADD(MONTH,2,'2014-12-30') 结果:2015-02-28

年:

在当前日期上加两年

select DATEADD(yy,2,'2014-12-30') 结果:2016-12-30
select DATEADD(year,2,'2014-12-30') 结果:2016-12-30

语法

DATEADD(datepart,number,date),即日期/时间增加或减少一个时间间隔:DateAdd(<间隔类型>,<间隔值>,<表达式>)

date 参数是合法的日期表达式。number是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数。

datepart 参数可以是下列的值:
datepart 缩写
年 yy, yyyy
季度 qq, q
月 mm, m
年中的日 dy, y
日 dd, d
周 wk, ww
星期 dw, w
小时 hh
分钟 mi, n
秒 ss, s
毫秒 ms
微妙 mcs
纳秒 ns

在这里插入图片描述
sql server convert()函数的使用方法

convert函数格式:convert(data_type,expression[,style])

说明:
data_type:目标系统所提供的数据类型,如果转换时没有指定数据类型的长度,则 SQL Server 自动提供长度为 30。

expression:是任何有效的 Microsoft® SQL Server™ 表达式

style:【可选参数】日期格式样式,此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar)相互转换的时候才用到

style 参数提供的数值确定了 datetime 数据的显示方式,年份可以显示为两位或四位数。默认情况下,SQL Server 将年份显示为两位数。若要显示包括世纪的四位数年份 (yyyy)(即使年份数据是使用两位数的年份格式存储的),请给 style 值加 100 以获得四位数的年
在这里插入图片描述
例子:
1、yyyy-mm-dd hh:mm:ss转为yyyy-mm-dd

 Select convert(char(10),getdate(),126);

把2022-12-12 00:00:00.000 转为 2022-12-12

2、yyyy-mm-dd hh:mm:ss.SSS转为yyyy-mm-dd hh:mm:ss

Select convert(char(19),START_TIME_,120)

把 2022-12-12 13:42:35.123 转为 2022-12-12 13:42:35

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

程序员快速成长的核心原则

如何快速成长、持续成长、提升技术&#xff0c;是每一个程序员都绕不开的话题。 当你还在困惑职业发展方向时&#xff0c;别人已经找好了接单平台开始兼职&#xff1b;当你还在苦恼bug修不好时&#xff0c;别人已经可以承接整个软件外包项目了&#xff1b;当你还在思考怎么让技…

MongoDB 命令行操作

通过 MongoDB 数据库安装详细教程 安装完成了MongoDB&#xff0c;MySQL数据库是通过sql命令操作数据&#xff0c;而MongoDB是通过类Javascript函数的查询方式进行数据库的操作&#xff0c;在使用MongoDB来操作数据库之前先来简单的了解MongoDB操作注意&#xff1a; MongoDB数据…

使用线性光耦合器的模拟隔离

介绍 模拟隔离仍然广泛应用于电机驱动、功率监测等&#xff0c;其中应用通常使用廉价的模拟电压控制来进行速度、强度或其他调整。 HCNR201/200模拟光耦合器通常被添加到&#xff0c;用于隔离应用电路的前端模块中的模拟信号。光耦合器将放置在模拟输入和A/D转换器之间&#…

C++list

1. list的介绍及使用 1.1 list的介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其…

外包出去找工作被歧视,投几个简历都说介意外包,不考虑外包。

说起外包这个话题&#xff0c;一直是职场的热门话题。 关于外包&#xff0c;最多被人讨论的就是歧视方面的。比如&#xff0c;关于门禁权限方面的歧视、关于语言交流上的歧视、关于福利上的歧视等等。 01 外包被歧视的情况确实存在 网传有一腾讯外包员工在脉脉上吐槽自己遭受…

python--内置高阶函数、异常处理;模块与包以及python基础部分的总结

文章目录一、内置高阶函数二、异常处理异常处理机制抛出异常三、模块与包python基础部分的总结一、sort()与sorted()函数的区别二、深拷贝和浅拷贝、is与四、基础部分的脑图总括一、内置高阶函数 map()函数 reduce()函数 filter()函数 sorted()函数 #排序 二、异常处理 Indent…

java基础巩固-宇宙第一AiYWM:为了维持生计,测试篇预热【单元测试、性能测试、灰度发布与回滚】~整起

单元测试【就像买保险&#xff0c;希望自己不要用上】是重构的保护网&#xff1a;单元测试可以为重构提供信心&#xff0c;降低重构的成本。我们要像重视生产代码那样&#xff0c;重视单元测试【元测试&#xff08;Unit Testing&#xff09;是针对程序模块&#xff08;软件设计…

协同过滤CF

算法提出 如果让推荐系统领域的从业者选出业界影响力最大、应用最广泛的模型&#xff0c;那么笔者认为90%的从业者会首选协同过滤。1992年, Xerox的研究中心开发了一种基于协同过滤的邮件筛选系统&#xff0c;用以过滤一些用户不感兴趣的无用邮件。2003 年&#xff0c;Amazon …

MySQL数据表的基础知识

目录 一、增 二、查 a、全列查询 b、指定列查询 c、查询字段为表达式 d、别名查询 e、对查询结果进行去重 f、排序 ​g、条件查询 三、改 四、删 以下操作均以student表为基础&#xff1a; 一、增 insert into 表名 values(...); 例如&#xff1a;新增张三同学的…

举个栗子!Tableau 技巧(247):用震波图(Seismogram)查看数据变化

震波图&#xff08;Seismogram&#xff09;是一种像地震波或声波的图表&#xff0c;通常用于表达数据的变化。乍一看&#xff0c;它有点像 蝴蝶图&#xff08;旋风图&#xff09;&#xff0c;数据都分布在轴的零点两侧&#xff0c;但其实两者完全不同。 如下震波图&#xff0c…

Stm32旧版库函数6——ov2640 串口显示图像 串口中断 使用旧版库 模拟IIC

/******************************************************************************* // // 使用单片机STM32F100C8T6 8 // 晶振&#xff1a;8.00M // 编译环境 Keil uVision4 // 在3.3V的供电环境下&#xff0c;就能运行 // 波特率 115200 // 使用&#xff1a;STM32F100C…

SpringCloud Config 分布式配置中心

分步式系统面临配置问题&#xff1a; 微服务意味着要将单体应用中的业务拆分成一个个子服务&#xff0c;每个服务的粒度相对较小&#xff0c;因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行&#xff0c;所以一套集中式的、动态的配置管理设施是必不…

浅谈电气火灾监控系统在煤矿高层公寓中的应用分析

摘要&#xff1a; 煤矿高层公寓做为人员高度密集场所&#xff0c;使用的电器种类繁多&#xff0c;一旦发生电气火灾事故&#xff0c; 其严重性和危害性远高于其它场所。文章通过对煤矿公寓电气线路火灾主要形式的分析&#xff0c;对电气火灾监 控系统在煤矿公寓电气火灾预防及…

NLG解码策略

NLG解码策略 自然语言生成&#xff08;Natural Language Generation&#xff0c;简称NLG&#xff09;&#xff0c;是自然语言处理领域的一个重要分支&#xff0c;在文本摘要生成任务中&#xff0c;另一个重要的分支是自然语言理解&#xff08;Natural Language Understanding&…

传奇GOM引擎版本架设

传奇GOM引擎版本架设 传奇GOM引擎版本我们架设游戏需要用到的工具&#xff1a; 版本&#xff08;游戏类型服务端&#xff09;、DBC2000&#xff08;游戏数据库&#xff09;、RAR&#xff08;解压工具&#xff09;、传奇客户端、服务器、网盘 先把这些架设工具准备好&#xff…

性能测试——

目录 测试的分类 性能测试的指标 性能测试需求分析 ​编辑 性能测试计划及方案 ​编辑​编辑 测试用例设计及执行 梳理系统架构 压力测试报告 测试的分类 性能测试的指标 性能测试需求分析 性能测试计划及方案 测试用例设计及执行 估算系统的qps要了解什么&#xff1a; 系…

Hot100-最小路径和

1 前言 1.1 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 如下图所示&#xff1a; 输入&#xff1a;grid [[1,3,1],[1,5,1…

ConversionService转换服务使用

前言 在最近分析和写的SpringBoot源码分析(面试官&#xff1a;你说说Springboot的启动过程吧(5万字分析启动过程))中&#xff0c;给自己留了一个关于ConversionService的使用的作业&#xff0c;这不就来补作业了。 使用出处 这个转换服务我这里的例子很简单&#xff0c;就是…

计算机研究生就业方向之去大厂做架构师

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么&#xff0c;如果你只是转码&#xff0c;那么你不一定要考研&#xff0c;至少以下几个职位研究生是没有啥优势的&#xff1a; 1&#xff0c;软件测试工程师&#xff08;培训一下就行&#xff09; 2&#xff0c;前…

RocketMQ详解及开发用例

概念 Apache RocketMQ作为阿里开源的一款高性能、高吞吐量的分布式消息中间件。 支持Broker和Consumer端消息过滤&#xff0c;支持发布订阅模型和点对点&#xff0c;支持拉pull和推push两种消息模式&#xff0c;单一队列百万消息、亿级消息堆积&#xff0c;支持单master节点&a…