Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取具有不同月份开始和结束日期的月份名称_Sql_Sql Server 2008 - Fatal编程技术网

Sql 获取具有不同月份开始和结束日期的月份名称

Sql 获取具有不同月份开始和结束日期的月份名称,sql,sql-server-2008,Sql,Sql Server 2008,显然,获取当前日期的月份是很简单的,但是我需要获取具有不同结束日期的月份名称 我需要获得月份名称,月份的开始日期是该月第一个星期三之后的第一个星期四,月份的结束日期是下个月的第一个星期三。这是一个会计问题,所以我不打算与规范争论 e、 g.2014年,1月从1月9日到2月5日,2月从2月6日到3月5日,3月从3月6日到4月2日。我建议您创建一个包含“会计月”的表格,其中包含开始日期、结束日期和月名列 然后,您可以查询该行以查找日期介于开始日期和结束日期之间的行,并返回月份名称。将其放入一个标量函

显然,获取当前日期的月份是很简单的,但是我需要获取具有不同结束日期的月份名称

我需要获得月份名称,月份的开始日期是该月第一个星期三之后的第一个星期四,月份的结束日期是下个月的第一个星期三。这是一个会计问题,所以我不打算与规范争论


e、 g.2014年,1月从1月9日到2月5日,2月从2月6日到3月5日,3月从3月6日到4月2日。

我建议您创建一个包含“会计月”的表格,其中包含开始日期、结束日期和月名列


然后,您可以查询该行以查找日期介于开始日期和结束日期之间的行,并返回月份名称。将其放入一个标量函数将使其可重用,并相对容易地在未来几年和几个月进行更新。

我建议您创建一个包含“会计月份”的表,其中包含开始日期、结束日期和月份名称列

然后,您可以查询该行以查找日期介于开始日期和结束日期之间的行,并返回月份名称。将其放入标量函数中,将使其可重用,并且在未来数年或数月内相对容易地更新。

我认为,按照Paddy的说法,查找表是最简单的方法。以下是为其生成行的一种方法:

; With Numbers(n) as (
    select 4 union all select 5
), Months as (
    select CONVERT(date,'20010104') as StartDt,CONVERT(date,'20010207') as EndDt,
           DATENAME(month,'20010103') as Month
    union all
    select DATEADD(week,n1.n,StartDt),DATEADD(week,n2.n,EndDt),
           DATENAME(month,DATEADD(week,n1.n,StartDt))
    from Months,Numbers n1,Numbers n2 --Old-skool join, just for once
    where DATEPART(day,DATEADD(week,n1.n,StartDt)) between 2 and 8 and
          DATEPART(day,DATEADD(week,n2.n,EndDt)) between 1 and 7 and
          StartDt < '21000101'
)
select * from Months option (maxrecursion 0)
CW因为这实际上只是Paddy答案的一个扩展,但我不想编辑他们的答案,也不适合评论,所以我认为,按照Paddy的说法,查找表是最简单的方法。以下是为其生成行的一种方法:

; With Numbers(n) as (
    select 4 union all select 5
), Months as (
    select CONVERT(date,'20010104') as StartDt,CONVERT(date,'20010207') as EndDt,
           DATENAME(month,'20010103') as Month
    union all
    select DATEADD(week,n1.n,StartDt),DATEADD(week,n2.n,EndDt),
           DATENAME(month,DATEADD(week,n1.n,StartDt))
    from Months,Numbers n1,Numbers n2 --Old-skool join, just for once
    where DATEPART(day,DATEADD(week,n1.n,StartDt)) between 2 and 8 and
          DATEPART(day,DATEADD(week,n2.n,EndDt)) between 1 and 7 and
          StartDt < '21000101'
)
select * from Months option (maxrecursion 0)


CW因为这实际上只是Paddy答案的延伸,但我不想编辑他们的答案,也不适合发表评论

虽然我同意这是最简单的,但不一定是最可持续的@franglais-只有1000行,你可以建模80年以上。填充这样一个表不需要很长时间。把它作为一个表达式/函数来做可能会很痛苦,但我并不是在试图找出其中一个:——@Damien_这个不信的人很公平——最好的方法是不手动填充表格?@franglais——你可能需要告诉我们关于开始和结束月份的规则。对不起,只要再看一眼这个问题,你就会发现你已经做到了……虽然我同意这是最简单的,但不一定是最可持续的@franglais-只有1000行,你可以建模80年以上。填充这样一个表不需要很长时间。把它作为一个表达式/函数来做可能会很痛苦,但我并不是在试图找出其中一个:——@Damien_这个不信的人很公平——最好的方法是不手动填充表格?@franglais——你可能需要告诉我们关于开始和结束月份的规则。对不起,再看看这个问题,你已经知道了…如果一个月从星期四开始,上个月与这个月重叠一周,因为第一个星期三是这个月的第七个星期三,但是第一个星期四是第一个星期四?我怀疑这是真的,所以我怀疑规范需要调整,或者,如果没有,那么在这些时间段内正确的答案是什么?@Damien_the_unsiever在这种情况下,它将在第二个星期四开始-将更新最初的问题!所以,如果一个月从一个星期四开始,上个月与这个月重叠一周,因为第一个星期三是该月的第七个星期三,但是第一个星期四是第一个星期四?我怀疑这是真的,所以我怀疑规范需要调整,或者,如果没有,那么在这些时间段内正确的答案是什么?@Damien_the_unsiever在这种情况下,它将在第二个星期四开始-将更新最初的问题!不要理会那个评论,我有点糊涂了:给那个精彩的问题调整一个小建议。当前查询将把结束日期带回日期00:00:00,而把它带回日期23:59:59要好得多@franglais——如果你这么想,那么你可能应该在第二天返回并使用“忽略”这句话,我很厚:对这个精彩的问题调整一个小建议。当前查询将把结束日期带回日期00:00:00,而把它带回日期23:59:59要好得多@franglais-如果你这么想,那么你可能应该在第二天返回并使用