Параўнанне DateTime ў SQL Server

Я захоўваю DateTime ў базу дадзеных у якасці стандартнага DateTime як 2011-10-19 17: 18: 44.083. Мне трэба, каб выбраць усе радкі, калі поле даты і часу гэта складае 5 дзён пасля сённяшняга дня. Але я не хачу гэта параўнанне і падчас як раз у дзень дастаткова.

SELECT * FROM dbo.TestBox
where TargetDate = dateadd(day,5, getdate()) 

Гэта не працуе, я не ведаю дакладна, чаму, але, верагодна, яго глядзіць на час.

Загадзя дзякую,

2

6 адказы

Вы можаце зрабіць:

SELECT * FROM dbo.TestBox
where CONVERT(VARCHAR(8),TargetDate,112) = CONVERT(VARCHAR(8),dateadd(day,5, getdate()),112)

Ці, калі ў вас ёсць індэкс па TargetDate:

SELECT * FROM dbo.TestBox
where TargetDate >= CONVERT(VARCHAR(8),dateadd(day,5, getdate()),112) 
AND TargetDate < CONVERT(VARCHAR(8),dateadd(day,6, getdate()),112) 
2
дададзена

Калі вы выкарыстоўваеце 2008+, вы можаце кінуць і як дата:

where convert(date, targetdate) = convert(date, dateadd(day, 5, getdate()))

Калі вы выкарыстоўваеце 2005 або да, зрабіць нешта накшталт гэтага:

where convert(varchar, targetdate, 101) = convert(varchar, dateadd(day, 5, getdate()), 101)
2
дададзена
Так што, калі я выкажу зберажоную працэдуру DATETIME аргумент на .NET, як DbType.DateTime і параметр адпаведнасці ў SQL з'яўляецца DateTime, патрабуецца гэта пераўтварэнне?
дададзена аўтар MacGyver, крыніца

спроба:

select * 
from dbo.TestBox 
where datediff(dd, getdate(), TargetDate) = 5

<Моцны> Прыклад кода:

declare @targetDate as DateTime
set @targetDate = '2011-11-2'
select datediff(dd, getdate(), @targetDate)

<Моцны> Выснова:

5

1
дададзена
Чаму downvote?
дададзена аўтар RedFilter, крыніца
Фармат (частка, пачатак, канец) , таму было б GETDATE() - TargetDate ...
дададзена аўтар sll, крыніца

DATEDIFF to the rescue!

DECLARE @monday DATETIME;
DECLARE @fridayAM DATETIME;
DECLARE @fridayPM DATETIME;
SET @monday = '2011-10-23 10:50:00';
SET @fridayAM = '2011-10-28 08:00:00';
SET @fridayPM = '2011-10-28 17:30:00';
SELECT DATEDIFF(DAY, @monday, @fridayAm) AS AmDiff, 
       DATEDIFF(DAY, @monday, @fridayPm) AS PmDiff

Абодва AmDiff і PmDiff будзе 5.

1
дададзена

Праблема можа быць з-за розныя фарматы даты.

This link has all the date formatting options in sql http://databases.aspfaq.com/database/what-are-the-valid-styles-for-converting-datetime-to-string.html

Паспрабуйце нешта накшталт:

SELECT * FROM dbo.TestBox where CONVERT(CHAR(8), TargetDate , 1)= dateadd(day,5, (CHAR(8), getdate(), 1))  

Гэта ператварае абедзве даты вы параўноўваеце у тым жа фармаце і губляе частку часу

Замест таго, каб выкарыстоўваць GETDATE() можна таксама выкарыстоўваць CURRENT_TIMESTAMP

0
дададзена

Наступны запыт павінен рабіць тое, што патрабуецца.

SELECT * FROM dbo.TestBox 
WHERE TargetDate 
        BETWEEN DATEADD(DAY, 5, DATEADD(MILLISECOND, 1, DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)))
        AND DATEADD(DAY, 5, DATEADD(MILLISECOND, -2, DATEADD(DAY, datediff(day, 0, GETDATE()) + 1, 0))) -- between the start and end of the date in 5 days
0
дададзена
Я атрымаў авансавы голас за гэты адказ, было б карысна пракаментаваць, чаму.
дададзена аўтар Ant Swift, крыніца