首页 > 数据库 >SQL Server中怎么实现445会计期间。

SQL Server中怎么实现445会计期间。

时间:2023-06-26 12:55:06浏览次数:35  
标签:CASE END FullDate WHEN 445 ELSE SQL Server SELECT

 我的在使用sql的函数计算周数和月份等期间数据都是基于自然月份来的。

然而,有些场合,比如会计年度日历表期间的定义是基于4 - 4 - 5 原则设立。

基于会计年度的期间

2017年会计日历

 

很显然这种日历与自然月的划分大为不同,那么怎么在Sql中实现这个日历。我在国外的论坛中代到一段代码可以实现。

DECLARE @StartDate DATE  = '20230101';
DECLARE @EndDate DATE    = '20301231';
DECLARE @MonthEndDay INT = 7; -- Saturday

-- Tally table creates all the date values which can then be used as your date dimension.
WITH t(t) AS(SELECT t FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t(t))
    ,d(d) AS(SELECT top(SELECT datediff(d,@StartDate,@EndDate)+1) dateadd(d,ROW_NUMBER()OVER(ORDER BY (SELECT NULL))-1,@StartDate)FROM t t1,t t2,t t3,t t4,t t5,t t6)
    ,c    AS(SELECT d AS FullDate
                   ,CASE WHEN MONTH(d) = 12  -- This logic is to handle the final day of the year.
                       THEN CASE WHEN DAY(d) = 31 THEN 1 ELSE 0 END
                       ELSE CASE WHEN SUM(CASE WHEN datepart(weekday,dateadd(d,-1,d)) = @MonthEndDay THEN 1 ELSE 0 END) OVER (partition BY YEAR(d) ORDER BY d) IN(4,8,13,17,21,26,30,34,39,43,47,52)
                                   AND datepart(weekday,d) = @MonthEndDay
                               THEN 1
                               ELSE 0
                               END
                       END AS FiscalPeriodEndDate
                   ,SUM(CASE WHEN datepart(weekday,dateadd(d,-1,d)) = @MonthEndDay THEN 1 ELSE 0 END) OVER (partition BY YEAR(d) ORDER BY d) AS WeekNum
                   ,((SUM(CASE WHEN datepart(weekday,dateadd(d,-1,d)) = @MonthEndDay THEN 1 ELSE 0 END) OVER (partition BY YEAR(d) ORDER BY d)-1) / 13)+1 AS QuarterNum
             FROM d
            )
SELECT FullDate
      ,FiscalPeriodEndDate
      ,WeekNum

         -- Where there is a 53rd week it will show as the 5th Quarter per the calculation above, so change it to 4th.
      ,CASE WHEN QuarterNum > 4 THEN 4 ELSE QuarterNum END AS QuarterNum

         -- Examples of different date functions you can use to make querying and reporting easier and when indexed properly, a lot faster.
      ,YEAR(FullDate) AS DateYear
      ,MONTH(FullDate) AS DateMonth
      ,DAY(FullDate) AS DateDay
      ,datepart(weekday,FullDate) AS DateWeekDayNum
      ,datename(weekday,FullDate) AS DateWeekDayName
FROM c
ORDER BY FullDate;

 

这段代码还是有点可改进的地点,1,没有根据当前日期推前后10年的功能。一旦日期超表,又得改代码。2,没有计算出日期所在的会计期间PD数。

 

标签:CASE,END,FullDate,WHEN,445,ELSE,SQL,Server,SELECT
From: https://www.cnblogs.com/danielzhu/p/17505357.html

相关文章

  • hive最小化部署 生产部署 hiveserver2 代理对象 和metastore服务
    自带的derbe的数据库,建表后就是在路径下新建了一个文件,映射成表的概念,同时在yarn会去执行,但是很多数据量很小的操作不会提交到yarn从stu表读数据的时候用的inputformat写数据的时候用的outputformat   metastore服务保存表名和文件路径之间的映射关系  嵌入......
  • django 环境和安装 + job - 蓝v - django.core.exceptions.ImproperlyConfigured: SQL
    1.部署蓝鲸2.安装djangomkdir~/.virtualenvspython3-mvenv~/.virtualenvs/djangodevpython-mvenv~/.virtualenvs/djangodevsource~/.virtualenvs/djangodev/bin/activatedeactivatesource~/.virtualenvs/djangodev/bin/activatepipinstallDjangopython-c&quo......
  • MySQL 8.0原理与实战一网打尽,甲骨文数据库专家硬刚5年之作
    根据权威数据库技术排名网站DB-Engines今年4月的最新数据,MySQL是全球最流行的开源数据库,没有之一。在所有数据库排名中,MySQL仅次于Oracle,“屈居”亚军之位。但大家从截图中可以看出,MySQL与Oracle的得分差距已经非常小了。“开源壮年”数据库MySQL自1995年发布1.0版本以来,迄今已经走......
  • 1.startRedmineMySQL
    #!/bin/bashdockerstopredmineMySQLdockerrm-fredmineMySQLdockerrun--privileged=true\ -idt\ -p3307:3306\ --nameredmineMySQL\ --restart=always\ -v/home/mysql/data:/var/lib/mysql\ -v/home/mysql/conf/my.cnf:/etc/mysql/......
  • 32.docker mysql 启动问题随笔
    dockercpmysql:/etc/mysql/mysql.conf.d/mysqld.cnf/home/mysql/confmv mysqld.cnfmy.cnf#!/bin/bashdockerstopMySQLdockerrm-fmysqldockerrun--privileged=true\ -idt\ -p3307:3306\ --namemysql\ --restart=always\ -v/home/my......
  • Vmware ESXi 8.0安装Ubuntu18.04-Server教程
    一、创建虚拟机新建虚拟机下一步即可设置虚拟机名称及安装的系统选择一个可用的磁盘分配虚拟机硬件配置,并选择镜像分配基本的内存、硬盘空间后,点击CD/DVD选择镜像配置路径二、安装Ubuntu-Server安装完成后我们点开创建好的虚拟机如下,点击打开电源......
  • mysql 8.0.26以下版本的bug
    ############################## https://bugs.mysql.com/bug.php?id=103636               ####################################......
  • mysql锁
    1.表锁:locktablest1read,t2write;如果在某个线程A中执行这个语句,则其他线程【写t1】,【读写t2】的语句都会被阻塞。同时,线程A在执行unlocktables之前,也只能执行【读t1】,【读写t2】的操作。 2.行锁1)在InnoDB事务中,行锁是在需要的时候才加上的,但并不是不......
  • centos7 升级sqlite
    软件下载地址均为其官网。一.wget升级yuminstall-ywget 二.sqlite3安装sudoyuminstallsqlite-devel查看sqlite3的版本sqlite3-version三.sqlite3升级下载源码wgethttps://www.sqlite.org/2019/sqlite-autoconf-3290000.tar.gz版本可去官网选择SQLiteHome......
  • Python+mysql+tkinter+matplotlib的可视化学生成绩管理系统课程设计
    使用模块要求:tkinter、numpy、openpyxl、matplotlib、pymysql、re、time;其中matplotlib用于绘制统计图开发工具:pycharm专业版、python3.7、mysql8.0需要咨询、源码、定做、QQ扫码加:https://img-mid.csdnimg.cn/release/static/image/mid/ask/153137086786150.jpg点击此处链接......