Select I.Fee
From Item I
WHERE GETDATE() - I.DateCreated < 365 days
Jak mogę odjąć dwa dni? Wynik powinien wynosić dni. Np .: 365 dni. 500 dni .. etc ...odjąć dwie daty w SQL i dostać dzień wyniku
Select I.Fee
From Item I
WHERE GETDATE() - I.DateCreated < 365 days
Jak mogę odjąć dwa dni? Wynik powinien wynosić dni. Np .: 365 dni. 500 dni .. etc ...odjąć dwie daty w SQL i dostać dzień wyniku
Stosować DATEDIFF
Select I.Fee
From Item I
WHERE DATEDIFF(day, GETDATE(), I.DateCreated) < 365
użytku DATE_DIFF
Select I.Fee
From Item I
WHERE DATEDIFF(day, GETDATE(), I.DateCreated) < 365
EDIT: Wydaje się myliłem o spektaklu na przykładzie kodu. Najlepszym wykonawcą jest ten drugi fragment, który występuje jako drugi. Dowodzi to, co starałem się wyjaśnić, a różnice czasowe nie są tak dramatyczne:
----------------------------------
-- 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())
Przepraszam za komentarz późno i moja grubsza skomentował przykład, ale myślę, że ważne jest, aby wspomnieć SARG.
SELECT I.Fee
FROM Item I
WHERE I.DateCreated > DATEADD(DAY, -364, GETDATE())
Chociaż tabeli temp w poniższym kodzie nie ma indeksu, wydajność jest jeszcze wzmocniona przez fakt, że porównanie jest wykonywana między wyrazem a wartością w tabeli, a nie wyraz, który modyfikuje wartość w tabela i stała. Mam nadzieję, że okaże się to przydatne.
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())
dziękuję za informacje! –
SELECT (to_date('02-JAN-2013') - to_date('02-JAN-2012')) days_between
FROM dual
/
Jak o
Select I.Fee
From Item I
WHERE (days(GETDATE()) - days(I.DateCreated) < 365)
SELECT DATEDIFF(day,'2014-06-05','2014-08-05') AS DiffDate
diffdate jest nazwa kolumny.
wynik:
DiffDate
Dlaczego dodawanie odpowiedzi, która nie dodaje żadnych informacji do innych odpowiedzi w poście? –
To nie jest odpowiedź, to nie dodaje/wyjaśnia/poprawia itp. Coś do istniejących asnwers –
DateDiff należy obchodzić się ostrożnie. Jeśli zależy ci na kilku godzinach, to cię zawiedzie. 11 PM na 1AM to "1 dzień" zgodnie z DateDiff. Nie używaj go, jeśli widzisz dni jako "liczbę 24-godzinnych okresów". – Pxtl
@Pxtl czy istnieje funkcja w SQL, która również bierze pod uwagę czas? –
Nie o tym wiem. – Pxtl