Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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查询_Sql Server_Tsql_Stored Functions - Fatal编程技术网

Sql server 带函数的SQL查询

Sql server 带函数的SQL查询,sql-server,tsql,stored-functions,Sql Server,Tsql,Stored Functions,我有一个数据表,我正在使用计数语句获取提交日期的记录数量 范例 基本上,我使用以下代码来获得结果 SELECT YEAR([Date]) as YEAR, CAST([Date] as nvarchar(25)) AS [Date], COUNT(*) as "Audit Count" FROM AuditResults where AuditType = 'Identification' AND Product = 'Billet' gr

我有一个数据表,我正在使用计数语句获取提交日期的记录数量 范例

基本上,我使用以下代码来获得结果

SELECT YEAR([Date]) as YEAR, CAST([Date] as nvarchar(25)) AS [Date], COUNT(*) as "Audit Count"
        FROM    AuditResults
        where AuditType = 'Identification' AND Product = 'Billet' 
        group by Date
这将返回一个示例

YEAR  Date  Audit Count
2017    2017-06-27  1
2017    2017-06-29  3
现在,我希望能够检索所有日期,即使是空的 所以我希望回报是

YEAR  Date  Audit Count
2017  2017-06-27    1
2017  2017-06-28    0
2017  2017-06-29    3
我尝试使用以下功能:

ALTER FUNCTION [dbo].[fnGetDatesInRange]
(   
    @FromDate datetime,
    @ToDate datetime
)
RETURNS @DateList TABLE (Dt date) 
AS
BEGIN
    DECLARE @TotalDays int, @DaysCount int


      SET @TotalDays =  DATEDIFF(dd,@FromDate,@ToDate)
      SET @DaysCount = 0


        WHILE @TotalDays >= @DaysCount
        BEGIN
                INSERT INTO @DateList
                SELECT (@ToDate - @DaysCount) AS DAT


                SET @DaysCount = @DaysCount + 1
        END
        RETURN
END
如何将select语句用于此函数?还是有更好的办法?
干杯

您必须创建另一个作为Mysql的表日历-这个想法在所有RDBMS上都是一样的-

CREATE TABLE `calendar` (
    `dt` DATE NOT NULL,
    UNIQUE INDEX `calendar_dt_unique` (`dt`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
并填写日期数据

试试这个

ALTER FUNCTION [dbo].[fnGetDatesInRange]
(   
    @FromDate datetime,
    @ToDate datetime
)
RETURNS @YourData TABLE ([Year] int, DateText nvarchar(25),[Audit Count] int) 
AS
begin
insert into @YourData
SELECT 
    YEAR(allDates.[Date]) as YEAR, 
    CAST(allDates.[Date] as nvarchar(25)) AS [Date], 
    COUNT(r.Product) as "Audit Count"
from
    (
    SELECT 
        [date]=convert(datetime, CONVERT(float,d.Seq))
    FROM 
        (
        select top 100000 row_number() over(partition by 1 order by A.name) as Seq 
        from syscolumns A, syscolumns B  
        )d 
    )allDates
left join
    AuditResults r on r.[Date]=allDates.[date] and  r.AuditType = 'Identification' AND r.Product = 'Billet' 
where
    allDates.[Date]>=@FromDate and allDates.[Date]<=@ToDate
group by    
    allDates.[Date]

return
end

在本例中,这将返回1900和2173之间的所有日期。根据需要限制,但这是一个不错的选择。有很多不同的方法可以清楚地实现这一点

这只是另一种方法。使用语法作为RDBMS。我希望能够为fromdate和ToDate传入参数更新了什么?将存储过程合并到函数中?我现在怎么称呼它呢?从[dbo].[fnGetDatesInRange]'2017-05-24','2017-05-30'中选择*
ALTER FUNCTION [dbo].[fnGetDatesInRange]
(   
    @FromDate datetime,
    @ToDate datetime
)
RETURNS @YourData TABLE ([Year] int, DateText nvarchar(25),[Audit Count] int) 
AS
begin
insert into @YourData
SELECT 
    YEAR(allDates.[Date]) as YEAR, 
    CAST(allDates.[Date] as nvarchar(25)) AS [Date], 
    COUNT(r.Product) as "Audit Count"
from
    (
    SELECT 
        [date]=convert(datetime, CONVERT(float,d.Seq))
    FROM 
        (
        select top 100000 row_number() over(partition by 1 order by A.name) as Seq 
        from syscolumns A, syscolumns B  
        )d 
    )allDates
left join
    AuditResults r on r.[Date]=allDates.[date] and  r.AuditType = 'Identification' AND r.Product = 'Billet' 
where
    allDates.[Date]>=@FromDate and allDates.[Date]<=@ToDate
group by    
    allDates.[Date]

return
end
SELECT 
    [date]=convert(datetime, CONVERT(float,d.Seq))
FROM 
    (
    select top 100000 row_number() over(partition by 1 order by A.name) as Seq 
    from syscolumns A, syscolumns B  
    )d