2

ストアド関数を呼び出すクエリが以下にあります。関数では、開始日(@startdate)と終了日(@End date)を宣言する必要があることがわかります。これらのクエリは、Windowsタスクスケジューラを介して実行されるC#プログラム内で使用されます。これは、毎日販売情報のレポートを取得し、夜間のレポートの一部として夜間に自動メールで送信するという考え方です。このため、@startdateを「今日の」日付に割り当てる必要があります。たとえば、プログラムが今日自動実行されている場合、1/29/1300:00から1/29/1323:00までの販売情報が必要です。明日それが実行されるとき、私は1/30/1300:00から1/30/1323: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 

開始日は深夜になり、終了日は現在の日付から1秒を引いたものになります。(デモ付きのSQLフィドルを参照)

今日の日付を深夜に簡単に生成し、今日の日付の終了日を時刻で簡単に生成する方法を探している場合は、を23:59:59作成できますTable-Valued Function

このタイプの関数は、渡した値に基づいてstartdateとの両方を返すことができます。enddate

可能であれば、現在の関数を変更して1つの日付パラメーターを受け入れるようにします。次に、その関数内で、日付を返す新しい関数を呼び出すことができます。

新しい関数は次のようになります。

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)

MSDN1のチャートから使用したい形式に置き換えます

于 2013-01-29T21:08:01.837 に答える
0

時間の側面なしで今日の日付が必要な場合は、次のようにします。

Convert(Date,GetDate())

他のDateTime値に対しても同じことを行い、等しいかどうかを確認できます。同じ日のいずれかの時点で発生した場合はtrueになります。

于 2013-01-29T21:51:55.697 に答える