【T-SQL】获取指定日期的常用前后节点(月初月末周一周末等等)

注:周节点是根据中国习惯,视周一为起,周日为末。

/*---------------------------------
函数:获取某日期的特定起止日期v0.02
Author:AhDung
Update:201607251729。无论@@datefirst为何值,均不影响周节点
---------------------------------*/
ALTER FUNCTION dbo.FGetSpecialDate_ahdung(@date DATE, @SpcDate VARCHAR(20))
RETURNS DATE AS
BEGIN
IF @date IS    NULL RETURN NULL
IF @SpcDate IN ('YearBeg','YB','NC','年初') RETURN DATENAME(YEAR,@date)+'-01-01'
ELSE IF @SpcDate IN ('YearEnd','YE','NW','年尾','年末') RETURN DATENAME(YEAR,@date)+'-12-31'
ELSE IF @SpcDate IN ('QuarterBeg','QtBeg','QB','JC','季初') RETURN DATENAME(YEAR,@date)+CASE WHEN MONTH(@date)<=3 THEN '-01' WHEN MONTH(@date)<=6 THEN '-04' WHEN MONTH(@date)<=9 THEN '-07' ELSE '-10' END +'-01'
ELSE IF @SpcDate IN ('QuarterEnd','QtEnd','QE','JW','季尾','季末') RETURN DATENAME(YEAR,@date)+CASE WHEN MONTH(@date)<=3 THEN '-03-31' WHEN MONTH(@date)<=6 THEN '-06-30' WHEN MONTH(@date)<=9 THEN '-09-30' ELSE '-12-31' END
ELSE IF @SpcDate IN ('MonBeg','MB','YC','月初') RETURN CONVERT(CHAR(7),@date,120)+'-01'
ELSE IF @SpcDate IN ('MonEnd','ME','YW','月尾','月末') RETURN DATEADD(DAY,-1,CONVERT(CHAR(7),DATEADD(MONTH,1,@date),120)+'-01')
ELSE IF @SpcDate IN ('WeekBeg','WB','ZY','周一','WeekEnd','WE','ZR','ZM','周日','周末')
BEGIN
DECLARE @dw INT=DATEPART(dw,@date)
DECLARE @diff INT = 9-@@DATEFIRST
DECLARE @d INT= CASE WHEN @dw<@diff THEN @dw+7 ELSE @dw END
IF @SpcDate IN ('WeekBeg','WB','ZY','周一') RETURN DATEADD(DAY,@diff-@d,@date)
RETURN DATEADD(DAY,@diff-@d+6,@date)
END
RETURN @date
END

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

T-SQL Enhancement in SQL Server 2005[下篇]

在第一部分中,我们讨论了APPLY和CTE这两个T-SQL Enhancement。APPLY实现了Table和TVF的Join,CTE通过创建“临时的View...

2028
来自专栏Jerry的SAP技术分享

面试问题 - 只用位操作在ABAP里实现a+b

算法描述参考我的SCN博客 Just for fun – Implement a + b using pure bitwise operation in ABA...

3955
来自专栏DT乱“码”

Oracle CASE WHEN的一些使用

1. CASE WHEN 表达式有两种形式 复制代码代码如下: --简单Case函数   CASE sex   WHEN '1' THEN '男'   ...

2255
来自专栏乐沙弥的世界

SQL server 2005 UNPIVOT运算符的使用

      UNPIVOT运算符相对于PIVOT运算符,它执行与PIVOT相反的操作,即将列转换到行。需要注意的是UNPIVOT运算符并不完全是PIVOT的逆向...

711
来自专栏Hadoop数据仓库

Oracle 自定义split 函数

Oracle没有提供split函数,但可以自己建立一个函数实现此功能。比如“abc defg  hijkl   nmopqr     stuvw  xyz”,分...

2019
来自专栏c#开发者

获取数据字典

 表结构信息查询 SELECT      TableName=CASE WHEN C.column_id= THEN O.name ELSE N'' END,...

3775
来自专栏Java成神之路

Oracle学习笔记_06_CASE WHEN 用法介绍

貌似只有Oracle提供该函数,而且不支持ANSI SQL,语法上也没CASE WHEN清晰,个人不推荐使用。

581
来自专栏GreenLeaves

sql 查询目标数据库中所有的表以其关键信息

1、查询目标库中的所有表 SELECT obj.name tablename, ---表名 schem.name schemname, ---表所属的方案 i...

18810
来自专栏更流畅、简洁的软件开发方式

联动设置

813
来自专栏数据和云

高手过招:用SQL解决环环相扣的刑侦推理问题(苏旭辉版本)

本文是继 杨长老 刑侦高考:如何用SQL解决环环相扣的刑侦推理问题 之后,苏旭辉的一个版本,希望大家能够在高手的过招中,看到喜爱、坚持、执着与技艺。

1022

扫码关注云+社区

领取腾讯云代金券