0

私はこの機能を持っています

ALTER FUNCTION [General].[GetWeekEnding] 
(
@Date DATETIME
)
RETURNS DATETIME
AS
BEGIN
-- Return the result of the function
RETURN (DATEADD(day, -1 - (DATEPART(dw, @Date) + @@DATEFIRST - 2) % 7, @Date) + 7)
END

時間を 00:00:00.000 に設定し、提供された日付の週の終わりを見つける必要もありますか?

4

2 に答える 2

1

日付に時間要素を追加するために UDF を使用します。

CREATE FUNCTION [dbo].[DateTimeAdd] 
( 
      @datepart         date, 
      @timepart         time 
) 
RETURNS datetime2 
AS 
BEGIN 
      RETURN DATEADD(dd, DATEDIFF(dd, 0, @datepart), CAST(@timepart AS datetime2)); 
END

次に、あなたの場合、次のように使用できます。

SELECT dbo.DateTimeAdd(DATEADD (D, -1 * DatePart (DW, GetDate()) + 7, GetDate()), DATEADD(hh, 0, CAST(DATEADD(DAY, DATEDIFF(DAY, -1, GETDATE()), -1)  AS TIME)))    
于 2012-12-12T16:52:32.563 に答える
0

SQL Server 2005 以降、時間を削除する最善の方法は、dateデータ型にキャストすることです。

select cast(@Date as date)

date関数が aではなくa を返すようにすることをお勧めしますdatetime

週の終わりに到達するには、曜日を整数にマップするルックアップ テーブルが必要です。でこれを行うことができますdatepart。ただし、これはシステム設定の影響を受けます。ここに関数があります:

Create FUNCTION [GetWeekEnding] (
   @Date DATETIME,
   @WeekEndingDOW varchar(10)
)
RETURNS DATE
AS
BEGIN
-- Return the result of the function
    declare @newdate datetime;
    with lookup as (
        select 'Sunday' as dow, 0 as daynum union all
        select 'Monday' as dow, 1 as daynum union all
        select 'Tuesday' as dow, 2 as daynum union all
        select 'Wednesday' as dow, 3 as daynum union all
        select 'Thursday' as dow, 4 as daynum union all
        select 'Friday' as dow, 5 as daynum union all
        select 'Saturday' as dow, 6 as daynum
       )
    select @newdate = @Date - (select daynum from lookup where datename(dw, @date) = dow) + (select daynum from lookup where @WeekEndingDOW = dow);
    select @newdate = (case when @newdate < @date then @newdate + 7 else @newdate end)
    RETURN cast(@newdate as date)
END;

この関数はdatetime内部的に使用することに注意してください。私には理解できない何らかの理由で、@date が日時の場合、「@date + 1」と言って「日付値に 1 日を追加する」ことを意味できます。ただし、@date が日付の場合、これは機能しません。(これは、dateadd 関数にも当てはまります。)

于 2012-12-12T18:53:34.417 に答える