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