41
Select I.Fee
From Item I
WHERE GETDATE() - I.DateCreated < 365 days

2日を引くにはどうすればよいですか?結果は数日になるはずです。例:365日。500日..など...

4

7 に答える 7

73

DATEDIFFを使用する

Select I.Fee
From Item I
WHERE  DATEDIFF(day, GETDATE(), I.DateCreated) < 365
于 2013-01-02T09:04:19.947 に答える
8

使用するDATE_DIFF

Select I.Fee
From   Item I
WHERE  DATEDIFF(day, GETDATE(), I.DateCreated)  < 365
于 2013-01-02T09:04:33.933 に答える
7

編集:コード例のパフォーマンスについては間違っていたようです。最高のパフォーマンスは、投稿されたケースで2番目に実行されるスニペットです。これは私が説明しようとしていたことを示しており、時差はそれほど劇的ではありません。

----------------------------------
--  Monitor time differences
----------------------------------
CREATE CLUSTERED INDEX dtIDX ON #ArbDates (MyDate)
DECLARE @Stopwatch DATETIME 
SET @Stopwatch = GETDATE()
    -- SARGABLE
    SELECT *
    FROM #ArbDates
    WHERE MyDate > DATEADD(DAY, -364, '2010-01-01')


PRINT DATEDIFF(MS, @Stopwatch, GETDATE())
SET @Stopwatch = GETDATE()
    -- NOT SARGABLE
    SELECT *
    FROM #ArbDates
    WHERE DATEDIFF(DAY, MyDate, '2010-01-01') < 365
PRINT DATEDIFF(MS, @Stopwatch, GETDATE())

遅れて投稿してすみません、そして私の大雑把にコメントした例ですが、SARGに言及することは重要だと思います。

SELECT I.Fee
FROM Item I
WHERE  I.DateCreated > DATEADD(DAY, -364, GETDATE())

以下のコードの一時テーブルにはインデックスがありませんが、テーブルの値と定数を変更する式ではなく、式とテーブルの値の間で比較が行われるため、パフォーマンスは向上します。これがお役に立てば幸いです。

USE tempdb
GO

IF OBJECT_ID('tempdb.dbo.#ArbDates') IS NOT NULL DROP TABLE #ArbDates
DECLARE @Stopwatch DATETIME 

----------------------------------
--  Build test data: 100000 rows
----------------------------------
;WITH Base10 (n) AS
(
    SELECT 1 UNION ALL  SELECT 1 UNION ALL  SELECT 1 UNION ALL
    SELECT 1 UNION ALL  SELECT 1 UNION ALL  SELECT 1 UNION ALL
    SELECT 1 UNION ALL  SELECT 1 UNION ALL  SELECT 1 UNION ALL
    SELECT 1
)
,Base100000 (n) AS
(
    SELECT 1
    FROM Base10 T1, Base10 T3, Base10 T4, Base10 T5, Base10 T6
)
SELECT MyDate = CAST(RAND(CHECKSUM(NEWID()))*3653.0+36524.0 AS DATETIME) 
INTO #ArbDates 
FROM Base100000

----------------------------------
--  Monitor time differences
----------------------------------
SET @Stopwatch = GETDATE()

    -- NOT SARGABLE
    SELECT *
    FROM #ArbDates
    WHERE DATEDIFF(DAY, MyDate, '2010-01-01') < 365

PRINT DATEDIFF(MS, @Stopwatch, GETDATE())
SET @Stopwatch = GETDATE()

    -- SARGABLE
    SELECT *
    FROM #ArbDates
    WHERE MyDate > DATEADD(DAY, -364, '2010-01-01')

PRINT DATEDIFF(MS, @Stopwatch, GETDATE())
于 2013-01-02T09:51:05.053 に答える
3
SELECT DATEDIFF(day,'2014-06-05','2014-08-05') AS DiffDate

diffdateは列名です。

結果:

DiffDate

23

于 2015-05-25T12:43:55.717 に答える
2

どうですか

Select I.Fee
From Item I
WHERE  (days(GETDATE()) - days(I.DateCreated) < 365)
于 2013-07-11T04:18:10.220 に答える
1
SELECT (to_date('02-JAN-2013') - to_date('02-JAN-2012')) days_between
FROM dual
/
于 2013-01-02T13:45:58.300 に答える
0

構文

DATEDIFF(expr1、expr2)

説明

DATEDIFF()は、ある日付から別の日付までの日数で表された値(expr1 – expr2)を返します。expr1およびexpr2は、日付または日付と時刻の式です。値の日付部分のみが計算に使用されます。

@Dスタンリー

于 2021-02-01T05:39:41.777 に答える