2

我在下面有一个调用存储函数的查询。在函数中,您将看到我需要声明开始日期 (@startdate) 和结束日期 (@End date)。这些查询将在将通过 Windows 任务调度程序运行的 C# 程序中使用。这样做的想法是每天提取销售信息的报告,并在晚上自动通过电子邮件将其作为夜间报告的一部分。因此,我需要将@startdate 分配给“今天的”日期。例如,如果程序今天自动运行,我需要 1/29/13 00:00 到 1/29/13 23:00 的销售信息。明天运行时,我需要 1/30/13 00:00 到 1/30/13 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
4

3 回答 3

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

如果您正在寻找一种方法来轻松地在午夜生成今天的日期,然后生成带有 time 的今天日期的 enddate 23:59:59,那么您可以创建一个Table-Valued Function.

这种类型的函数可以返回startdateenddate基于您传入的值。

如果可能,那么我会更改您当前的函数以接受一个日期参数,然后在该函数内部您可以调用一个将返回日期的新函数。

新功能将与此类似:

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).
于 2013-02-07T22:10:23.130 回答
1

要获取日期,您可以使用以下 SQL 而不是函数:

 CAST(CONVERT(VARCHAR,GETDATE(),1) AS DATETIME)

从MSDN上的图表中替换1您想要使用的任何格式

于 2013-01-29T21:08:01.837 回答
0

如果您只想要没有时间方面的今天日期:

Convert(Date,GetDate())

您可以对任何其他 DateTime 值执行相同的操作并检查相等性,如果它们发生在同一天的任何时候,这将是正确的。

于 2013-01-29T21:51:55.697 回答