Sql server 存储过程中的日期函数
我创建了一个存储过程来获得每周结果。因此,使用两个输入参数StartDate和endDate,我可以得到我期望的结果。但这里的问题是,当一周从2015年8月28日开始到2015年9月3日结束时,一周中的28天、29天、30天、31天、32天、33天、34天都是上午。但预期结果是28、29、30、31、01、02、03、04 这是我的代码,用于上面的详细信息。帮我克服这个问题Sql server 存储过程中的日期函数,sql-server,date,stored-procedures,Sql Server,Date,Stored Procedures,我创建了一个存储过程来获得每周结果。因此,使用两个输入参数StartDate和endDate,我可以得到我期望的结果。但这里的问题是,当一周从2015年8月28日开始到2015年9月3日结束时,一周中的28天、29天、30天、31天、32天、33天、34天都是上午。但预期结果是28、29、30、31、01、02、03、04 这是我的代码,用于上面的详细信息。帮我克服这个问题 ALTER PROCEDURE [dbo].[usp_Get_TimesheetDetails] @Use
ALTER PROCEDURE [dbo].[usp_Get_TimesheetDetails]
@UserID int, @startdate datetime, @enddate datetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @intStartDate int
declare @intEndDate int
declare @strMonth varchar(50)
SELECT @intStartDate = DATEPART(day,@startDate)
Select @intEndDate = DATEPART(day,@endDate)
select @strMonth = DATENAME(MONTH, GETDATE())
declare @temptable table (num int)
declare @columns varchar(max)
DECLARE @sqlText nvarchar(1000);
DECLARE @startnum INT=@intStartDate-1
DECLARE @endnum INT=@intEndDate
;
WITH gen AS (
SELECT @startnum AS num
UNION ALL
SELECT num+1 FROM gen WHERE num+1<=@endnum
)
您需要将开始日期和结束日期值作为日期而不是整数传递 试试这个
DECLARE @startnum DATE = '20150828' --<-- Use ANSI date `YYYYMMDD`
DECLARE @endnum DATE = '20150903'
;WITH gen AS (
SELECT @startnum AS num
UNION ALL
SELECT DATEADD(DAY,1,num) FROM gen
WHERE DATEADD(DAY,1,num) <= @endnum
)
SELECT * FROM Gen
您需要传递开始日期和结束日期,而不是整数值。试试这个
DECLARE @startnum DATE = '08/28/2015'
DECLARE @endnum DATE ='09/03/2015';
DECLARE @startnum DATE = '08/28/2015'
DECLARE @endnum DATE ='09/03/2015';
WITH gen
AS (SELECT @startnum AS DAT
UNION ALL
SELECT Dateadd(DD, 1, DAT)
FROM gen
WHERE DAT <= @endnum)
SELECT RIGHT('0' + Cast(Day(DAT) AS VARCHAR(2)), 2)
FROM GEN
注意:因为这里的日期范围非常小,所以我使用了递归cte方法,否则您可以使用tally table生成日期这里是另一个使用强类型日期但没有递归cte循环的解决方案
WITH
t4 AS (SELECT n FROM (VALUES(0),(0),(0),(0)) t(n))
,t64 AS (SELECT ROW_NUMBER() OVER (ORDER BY (a.n)) - 1 AS num FROM t4 AS a, t4 AS b, t4 AS c)
SELECT DATEADD(day, num, @StartDate)
FROM t64
WHERE num <= DATEDIFF(day, @StartDate, @EndDate);
是的,明白了。简单,但错过了。谢谢你,伙计
WITH
t4 AS (SELECT n FROM (VALUES(0),(0),(0),(0)) t(n))
,t64 AS (SELECT ROW_NUMBER() OVER (ORDER BY (a.n)) - 1 AS num FROM t4 AS a, t4 AS b, t4 AS c)
SELECT DATEADD(day, num, @StartDate)
FROM t64
WHERE num <= DATEDIFF(day, @StartDate, @EndDate);