Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 server 存储过程中的日期函数_Sql Server_Date_Stored Procedures - Fatal编程技术网

Sql server 存储过程中的日期函数

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

我创建了一个存储过程来获得每周结果。因此,使用两个输入参数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]
    @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);