Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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_Sql Server 2008_Tsql - Fatal编程技术网

Sql 在两个日期之间获取每个月的开始和结束时间

Sql 在两个日期之间获取每个月的开始和结束时间,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有这张桌子: create table #tbl ( dt datetime ) insert into #tbl values ('2013-01-01 00:00:00') insert into #tbl values ('2013-02-01 00:00:00') insert into #tbl values ('2013-02-02 00:00:00') insert into #tbl values ('2013-03-01 00:00:00') 我需要得

我有这张桌子:

create table #tbl
 (
    dt datetime
 )

 insert into #tbl values ('2013-01-01 00:00:00')
 insert into #tbl values ('2013-02-01 00:00:00')
 insert into #tbl values ('2013-02-02 00:00:00')
 insert into #tbl values ('2013-03-01 00:00:00')
我需要得到每个不同月份的开始和结束,换句话说,这是预期的结果:

[start]                    [end]
 2013-01-01 00:00:00.000    2013-01-31 23:59:59.997
 2013-02-01 00:00:00.000    2013-02-28 23:59:59.997
 2013-03-01 00:00:00.000    2013-03-31 23:59:59.997
我不知道怎么做。请帮忙

select
 dateadd(mm, datediff(mm, 0, ???, 0),
 dateadd(ms, -3, dateadd(mm, datediff(m, 0, ??? + 1, 0))
我正在使用MS SQL Server 2008。

请尝试以下操作:

SELECT DISTINCT DATEADD(month, DATEDIFF(month, 0, MyDate), 0) as startOfMonth,
                DATEADD(day, -1, DATEADD(month, 1, DATEADD(day, 1 - day(MyDate), MyDate))) as endOfMonth
FROM MyTable

对于结束日期,您可以将该月的第一个日期加上1个月,然后减去3毫秒

SELECT 
    [end] = DATEADD(ms,-3, DATEADD(MM,1,DATEADD(MM,DATEDIFF(MM,0,dt),0)))
逻辑如下。对于表中的每个日期,查找自日期
0
(即自1900年1月起,as
cast(0 as datetime)
为1900年1月1日)起经过的月数
rm
。要避免重复,请使用不同的

select distinct rm = datediff(mm, 0, dt)
from #tbl t

上述语句被包装到名为
dm
的CTE中。然后,在<代码> DM >代码中的每一行,使用表达式<代码> DATEADD(mm,dm rm,0)< /> >计算相应月份开始的日期(从1900年1月开始添加数个月,即使原始日期在其中间的某个地方,也会给出月初)。它被添加到带有交叉应用构造的查询中,因为它的值不仅用于选择,而且用于计算月末日期。结束日期的计算方法是将开始日期加上一个月,再减去3毫秒(这样结束日期就不会是下一个月的开始日期)。

您可以看看这个“不以日期为目标”的例子2013-01-31 23:59:59.997。相反,目标是
2013-02-01
,并使用类似
mydate>=month\u start和mydate
的逻辑。这比之间的或>=和之间的灵活得多
select distinct rm = datediff(mm, 0, dt)
from #tbl t