我在下面有一个调用存储函数的查询。在函数中,您将看到我需要声明一个开始日期(@startdate)和一个结束日期(@End date)。这些查询将在将通过Windows任务调度程序运行的C#程序中使用。这样做的想法是每天为销售信息提取报告,并在夜间自动发送电子邮件作为夜间报告的一部分。因此,我需要将@startdate指定为“今天”的日期。例如,如果程序今天自动运行,我需要销售信息为1/29/13 00:00至1/29/13 23:00。明天运行时我需要在2013年1月30日至1月30日23:00之间销售。等等。我在报告的其他查询中使用dateadd datediff,但这是引用存储函数的唯一查询。如何在存储函数中完成相同的操作?
这是我的查询调用存储函数:
SELECT
SUM(QTY) AS Discounts
FROM
dbo.fFinancialDataFull('Date Range Report', @startdate , @enddate, '1', '1', 'ALL', 'ALL', 'ALL', 'ALL', '1', '1', '1', '1', '1') AS fFinancialDataFull_1
WHERE
(ReportCategoryID = 62)) AS unlimitedtbl
答案 0 :(得分:2)
很难判断您是想在当前查询之前还是在函数内部生成日期。
如果您想在调用该功能之前执行此操作。您可以轻松使用:
DECLARE @startdate AS DATETIME;
DECLARE @endDate AS DATETIME;
--- code that will work on any version of SQL Server
SET @startdate = DateAdd(day, DateDiff(day, 0, getdate()), 0)
SET @enddate = DateAdd(day, DateDiff(day, 0, getdate()), 0)
+ CAST('23:59:59' as datetime)
-- SQL Server 2008+ code with DATE datatype
SET @startdate = CAST(CAST(GETDATE() AS DATE) as datetime);
SET @enddate = CAST(GETDATE() AS DATE) + CAST('23:59:59' as datetime);
SELECT SUM(QTY) AS Discounts
FROM dbo.fFinancialDataFull('Date Range Report', @startdate , @enddate, '1', '1',
'ALL', 'ALL', 'ALL', 'ALL', '1', '1',
'1', '1', '1') AS fFinancialDataFull_1
WHERE ReportCategoryID = 62
开始日期为午夜,结束日期为当前日期减去一秒。 (见SQL Fiddle with Demo)
如果您正在寻找一种方法,可以在午夜轻松生成今天的日期,然后在今天的日期结束时使用时间23:59:59
,那么您可以创建Table-Valued Function
。
此类型的函数可以根据您传入的值返回startdate
和enddate
。
如果可能,那么我会改变你当前的函数来接受一个日期参数,然后在那个函数里面你可以调用一个返回日期的新函数。
新功能与此类似:
create function dbo.GetStartEndDates
(
-- pass in the date
@dt datetime
)
RETURNS @dates table
(
StartDate datetime,
EndDate datetime
)
AS
BEGIN
insert into @dates
select CAST(CAST(@dt AS DATE) as datetime) startdate, -- returns yyyy-mm-dd 00:00:00.000
CAST(@dt AS DATE) + CAST('23:59:59' as datetime) enddate -- returns yyyy-mm-dd 23:59:59.000
return
END
然后你当前的功能包括:
alter function dbo.fFinancialDataFull
(
--your list of parameters
--replace the start/end date with
@dateValue datetime
)
returns table...
as
begin
select *
from yourtable
cross apply dbo.GetStartEndDates(@dateValue) d -- this will return both start/end date
end
然后,您可以在查询的其余部分中使用开始/结束日期。
当您调用当前函数时,您将传递getdate()
或任何日期时间:
select *
from dbo.fFinancialDataFull(param1, param2, getdate(), etc, etc).
答案 1 :(得分:1)
答案 2 :(得分:0)
如果您只是想要今天的日期而没有时间方面:
Convert(Date,GetDate())
您可以对任何其他DateTime值执行相同操作并检查相等性,如果它们在同一天的任何时间点发生,则为真。