Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >在T中创建一个财政日历

在T中创建一个财政日历
EN

Stack Overflow用户
提问于 2017-07-13 07:00:23
回答 3查看 6.2K关注 0票数 3

我正在努力创建一个财政日历,其中财政年度从7月1日开始,一个星期被定义为星期一到星期天。

但是,例如,如果一个月中一周的第一天是星期六,那么星期六到星期日将被视为那个月的一周,而新的一周从星期一开始,到星期天结束等等。

请参阅下面要创建的表的示例:

  • 期间是指财政年度的月份。
  • 星期是那个月的星期数。
  • 开始日期(周开始日期)是一周开始的日子。
  • 结束日期(周结束日期)是周结束的一天。
  • 一周中的一天是开始日期和结束日期之间的日期。

我在想,我需要一个程序,可能需要在财政年度的第一天,然后遍历一年中所有的日子,加上开始和结束日期、周数、期间和日所属的年份。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-13 08:03:14

还有另一种选择。这将产生50年是0.703秒

示例

代码语言:javascript
代码运行次数:0
复制
Set DateFirst  1

Declare @Date1 date = '2017-07-01'
Declare @Date2 date = '2019-06-30'


Select Period    = Dense_Rank() over (Partition By FY Order By FM)
      ,Week      = Dense_Rank() over (Partition By FY,FM Order By FW)
      ,StartDate = Min(D) over (Partition By FY,FM,FW )
      ,EndDate   = Max(D) over (Partition By FY,FM,FW )
      ,DayOfWeek = D
      ,Year      = FY
 From (
        Select FY = DatePart(Year,@Date1)-1+sum(case when convert(varchar(5),@Date1,101)=convert(varchar(5),D,101) then 1 else 0 end) over (Order By D)
              ,FM = sum(case when DatePart(Day,D)=DatePart(Day,@Date1) then 1 else 0 end) over (Order By D)
              ,FW = sum(case when DatePart(WeekDay,D)=1 then 1 else 0 end) over (Order By D)
              ,D
         From (
                Select Top (DateDiff(DAY,@Date1,@Date2)+1) 
                       D  = DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),@Date1) 
                 From  master..spt_values n1,master..spt_values n2
              ) A1
      ) A
 Order By D
票数 2
EN

Stack Overflow用户

发布于 2017-07-13 07:20:35

您不需要一个过程,但是有些函数可以方便地使用。

首先,请记住,一些日期时间函数依赖于@@DATEFIRST。要使您的代码独立于此设置,您可以使用一个使天数正常化的函数。

代码语言:javascript
代码运行次数:0
复制
CREATE FUNCTION getNormalizedWeekDay
(
      @inputDate DATE
    , @dateFirst TINYINT = 1
)
RETURNS SMALLINT
AS
BEGIN
    RETURN ((DATEPART(WEEKDAY, @inputDate) + @@DATEFIRST - 1 - @dateFirst) % 7) + 1;
END

在这种情况下,您可以判断要使用哪一天,并根据该日期计算结果。例如,确定一天是否是星期天是很方便的。

如果我正确地理解了你,你想要一个周函数,它的行为类似于内置函数,但是把7月1日当作一年的第一天。

像这样的事情应该可以做到:

代码语言:javascript
代码运行次数:0
复制
CREATE FUNCTION getFiscalWeekNumber
(
      @inputDate        DATE
    , @firstFiscalMonth TINYINT = 7
    , @dateFirst        TINYINT = 1
)
RETURNS TINYINT
AS
BEGIN
    /* NULL Input handling. */
    IF (@inputDate IS NULL) BEGIN
        RETURN NULL
    END

    DECLARE @inputDateWeekDay        TINYINT = getNormalizedWeekDay(@inputDate, @dateFirst);
    DECLARE @inputWeekStartDate      DATE    = DATEADD(DAY, -(@inputDateWeekDay-1), @inputDate);

    DECLARE @firstDayOfYear          DATE    = DATEFROMPARTS(getFiscalYear(@inputDate, @firstFiscalMonth), @firstFiscalMonth, 1);
    DECLARE @firstWeekStartDate      DATE    = @firstDayOfYear;
    DECLARE @weekDayOfFirstDayOfYear TINYINT = getNormalizedWeekDay(@firstDayOfYear, @dateFirst);

    -- The day is between the first day of year and the beginning of the second week -> 1st (partial) week for non-iso style
    IF (@inputDate >= @firstDayOfYear AND @inputDate < DATEADD(DAY, -(@weekDayOfFirstDayOfYear-1), DATEADD(DAY, 7, @firstWeekStartDate))) BEGIN
        RETURN 1;
    END

    -- Adjust the first day of the weeks to match with @dateFirst.
    SET @firstWeekStartDate = DATEADD(DAY, -(@weekDayOfFirstDayOfYear-1), @firstWeekStartDate);

    RETURN (DATEDIFF(DAY, @firstWeekStartDate, @inputWeekStartDate) / 7) + 1;
END

请记住,一些函数可能不存在于Server的旧版本中,我使用的是Server 2016。

票数 0
EN

Stack Overflow用户

发布于 2017-07-13 07:31:24

您可以使用common table expression (简称cte)计数表创建此表。这涉及到手动指定前10行( select t from values...位),然后在第二个cte中将其多次提交给自己,以指数方式创建更多行。因为我有6个交叉联接( t t1, t t2, t t3...部分),所以我正在生成100万行(10^6),然后计算出top子句中实际需要多少行,然后使用row_number生成一个迭代列表,该列表将作为天数添加到您的期间开始日期。

它的输出是一个可以应用函数的日期表,甚至可以跨多个财政年度工作。我建议您使用它创建一个Dates查找表,而不是每次运行一次:

代码语言:javascript
代码运行次数:0
复制
declare @DateStart date = '20160701'
       ,@DateEnd   date = '20170630';

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(datediff(d,@DateStart,@DateEnd)+1) dateadd(d,row_number() over (order by (select null))-1,@DateStart) from t t1,t t21,t t31,t t4,t t5,t t6)
select ((dense_rank() over (order by dateadd(m,datediff(m,0,d),0)) - 1) % 12) + 1 as [Period]

      ,dense_rank() over (partition by dateadd(m,datediff(m,0,d),0)
                          order by case when dateadd(d,1-datepart(dw,d),d) < dateadd(m,datediff(m,0,d),0)
                                        then dateadd(m,datediff(m,0,d),0)
                                        else dateadd(d,1-datepart(dw,d),d)
                                        end) as [Week]

      ,case when dateadd(d,1-datepart(dw,d),d) < dateadd(m,datediff(m,0,d),0)
            then dateadd(m,datediff(m,0,d),0)
            else dateadd(d,1-datepart(dw,d),d)
            end as StartDate

      ,case when dateadd(d,7-datepart(dw,d),d) > dateadd(m,datediff(m,0,d)+1,0)
            then dateadd(d,-1,dateadd(m,datediff(m,0,d)+1,0))
            else dateadd(d,7-datepart(dw,d),d)
            end as EndDate

      ,d as DayOfWeek
      ,year(d) as [Year]
from d
order by d;

输出:

代码语言:javascript
代码运行次数:0
复制
+--------+------+-------------------------+-------------------------+------------+------+
| Period | Week |        StartDate        |         EndDate         | DayOfWeek  | Year |
+--------+------+-------------------------+-------------------------+------------+------+
|      1 |    1 | 2016-07-01 00:00:00.000 | 2016-07-02 00:00:00.000 | 2016-07-01 | 2016 |
|      1 |    1 | 2016-07-01 00:00:00.000 | 2016-07-02 00:00:00.000 | 2016-07-02 | 2016 |
|      1 |    2 | 2016-07-03 00:00:00.000 | 2016-07-09 00:00:00.000 | 2016-07-03 | 2016 |
|      1 |    2 | 2016-07-03 00:00:00.000 | 2016-07-09 00:00:00.000 | 2016-07-04 | 2016 |
|      1 |    2 | 2016-07-03 00:00:00.000 | 2016-07-09 00:00:00.000 | 2016-07-05 | 2016 |
|      1 |    2 | 2016-07-03 00:00:00.000 | 2016-07-09 00:00:00.000 | 2016-07-06 | 2016 |
|      1 |    2 | 2016-07-03 00:00:00.000 | 2016-07-09 00:00:00.000 | 2016-07-07 | 2016 |
|      1 |    2 | 2016-07-03 00:00:00.000 | 2016-07-09 00:00:00.000 | 2016-07-08 | 2017 |
.
.
.
|     12 |    5 | 2017-06-25 00:00:00.000 | 2017-07-01 00:00:00.000 | 2017-06-28 | 2017 |
|     12 |    5 | 2017-06-25 00:00:00.000 | 2017-07-01 00:00:00.000 | 2017-06-29 | 2017 |
|     12 |    5 | 2017-06-25 00:00:00.000 | 2017-07-01 00:00:00.000 | 2017-06-30 | 2017 |
+--------+------+-------------------------+-------------------------+------------+------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45084425

复制
相关文章
Excel每个单元格都统一加上(或减去)一个数
文章背景:处理Excel单元格数据时,有时需要在单元格区域内同时增加或减少某一数值,这里介绍两种操作方法。
Exploring
2022/08/10
1.8K0
[MySQL]更新时间(加上或者减去一段时间)
定义和用法 DATE_ADD() 函数向日期添加指定的时间间隔。 DATE_SUB() 函数向日期减少指定的时间间隔。 语法 DATE_ADD(date,INTERVAL expr type) DATE_SUB(date,INTERVAL expr type)
用户2353021
2020/05/11
3.9K0
[MySQL]更新时间(加上或者减去一段时间)
DataGridView列自适应宽度
来源:http://www.cnblogs.com/wolf-sun/p/3480104.html
跟着阿笨一起玩NET
2018/09/20
1.8K0
DataGridView列自适应宽度
Windows2003下列引导或系统启动驱动程序无法加载:packet
优化了下系统,重启出现了一个错误。 弹出应用程序: 服务控制管理器 : 在系统启动时至少有一个服务或驱动程序产生错误。详细信息,请使用事件查看器查看事件日志。 仔细查看了一下windows日志记录错误原因是windows启动的时候提示一项服务或者驱动出错,在windows的安全日志中找到了如下的描述:
zhaoJian.Net
2023/02/24
8000
数组或对象中的内容间隔显示
总结:间隔显示,不要使用for 循环,原因是for循环是同步,setTimeout是异步,同步执行完再执行异步。
tianyawhl
2019/11/07
4.3K0
根据数据源字段动态设置报表中的列数量以及列宽度
在报表系统中,我们通常会有这样的需求,就是由用户来决定报表中需要显示的数据,比如数据源中共有八列数据,用户可以自己选择在报表中显示哪些列,并且能够自动调整列的宽度,已铺满整个页面。本文就讲解一下Act
葡萄城控件
2018/01/10
4.9K0
根据数据源字段动态设置报表中的列数量以及列宽度
Ordering列以或更好性能
为减少数据库的存储空间,需要确保对列进行排序,通常最好先放置固定大小的列,然后再添加可变长度的列。
yzsDBA
2021/04/26
3180
OC中获取一串字符串的高度(宽度确定)或宽度(高度确定)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/52937475
用户1451823
2018/09/13
2.6K0
Element Vue 框架的 Table 列宽度自适应解决方案
# 原理 请求获取数据后,遍历数据,动态渲染一个节点,获取节点的宽度,最后改变表格列宽度 # 核心代码 /** * 计算字符串宽度 * @param str * @returns {number} */ function getStrWidth (str) { if (!document.getElementById('str-width')) { document.getElementsByTagName('body')[0].insertAdjacentHTML('beforeend', '<s
cnguu
2020/10/23
2.9K0
按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值
前几天在Python星耀交流群有个叫【在下不才】的粉丝问了一个Pandas的问题,按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值,这里拿出来给大家分享下,一起学习。
前端皮皮
2022/08/17
3K0
按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值
给图片或文字加上鼠标悬浮时旋转动画
一个很简单的css即可实现图片或文字鼠标悬浮时旋转动画。这里就简单的说一下2d旋转。 首先用到 transform 属性,具体代码如下: transform:rotate(360deg); -ms-transform:rotate(360deg); /* IE 9 */ -moz-transform:rotate(360deg); /* Firefox */ -webkit-transform:rotate(360deg); /* Safari 和 Chrome */ -o-transform:
雨尘
2018/07/17
2.3K0
win10 uwp 如何修改 Flyout 的宽度或高度
在堆栈有小伙伴问如何修改 Flyout 的宽度,他看到宽度会使用第一个元素的大小而不是最大的
林德熙
2020/03/25
1.5K0
win10 uwp 如何修改 Flyout 的宽度或高度
最大宽度最小宽度
    css3又加入了min-width,min-height,max-with,max-height等属性
十月梦想
2018/08/29
3.1K0
7-标识列或自增长列
# 标识列 /* 又称为自增长列 含义:可以不用手动插入值,系统提供默认的序列值 特点: 1. 标识列必须和键搭配(主键,唯一,外键等) 2. 一个表中只能有一个标识列 3. 标识列的类型只能是数值型(整型+浮点型) */ # 创建表时,设置某列为标识列 DROP TABLE IF EXISTS tab_identify; CREATE TABLE tab_identify( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); TRUN
Ywrby
2022/10/27
5390
java/poi 调整Excel 列宽支持自适应中文字符宽度
apache/poi是apache旗下用于读写Microsoft Office 二进制文件和OOXML 格式文件的开源库。用它来进行excel文件的导出是很趁手的。 一般来说可以直接使用 Sheet.autoSizeColumn方法自动调整每列的宽度。但是遇到包含中文的列,autoSizeColumn方法计算的列宽是不正确的,算出的宽度不能完整显示中文内容。最近项目中就遇到了这个问题,于是参考网上的各类文章,自己实现了自动适应中文字符宽度的方法
10km
2022/09/16
3.1K1
pandas 导出 Excel 文件的时候自动列宽,自动加上边框
尝试过 xlrd、xlwt、openpyxl、xlwings、pandas 来处理 Excel,如果说除了读写 Excel,还要做数据分析,还是 pandas 最好用,大多数情况下,你根本不需要把数据插入数据库,再用 SQL 去做数据分析。
somenzz
2022/10/25
2.3K0
vue+element实现表格跨行或跨列合并
vue+element用于pc后台管理系统比较多,所以后台管理系统一般以处理数据为主,数据结构的复杂程度变高,相对应的前端展示成本也提高, 有些产品经理或许会要求表格跨行或跨列合并,如果你正在想怎么实现,那就接着往下看 最新封装了一个表格合并和编辑插件:vue-split-table,戳一戳 效果图
火狼1
2019/04/17
7.9K0
vue+element实现表格跨行或跨列合并
点击加载更多

相似问题

在VSCode中打开木星: TypeError:无法读取未定义的属性(读取'makeSettings')

14

文件移动/复制操作后无法读取的木星笔记本

116

无法发射木星笔记本

29

无法设置木星笔记本

12

我无法在我的木星笔记本上读取数据。

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文