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 関数にも当てはまります。)