Как мога да избера 12/20/2008 в клауза where
на sql?
Сървърът е SQL server 2005.
select * from tblErrorLog
where errorDate = '12/20/2008'
Как мога да избера 12/20/2008 в клауза where
на sql?
Сървърът е SQL server 2005.
select * from tblErrorLog
where errorDate = '12/20/2008'
На първо място, бих препоръчал да използвате стандартния формат ISO-8601 за дата/час - той работи независимо от езиковите и регионалните настройки на вашия SQL Server. ISO-8601 е форматът YYYYMMDD
- без интервали, без тирета - само данните:
select * from tblErrorLog
where errorDate = '20081220'
Второ, трябва да сте наясно, че SQL Server 2005 DATETIME
винаги включва време. Ако проверите за точно съвпадение само с частта с датата, ще получите само редове, които съвпадат с време 0:00:00 - нищо друго.
Можете или да използвате която и да е от споменатите заявки за препоръчителен диапазон, или в SQL Server 2008 можете да използвате само DATE
дата и час - или можете да направите проверка нещо като:
select * from tblErrorLog
where DAY(errorDate) = 20 AND MONTH(errorDate) = 12 AND YEAR(errorDate) = 2008
Което работи най-добре за вас.
Ако трябва да правите тази заявка често, можете или да опитате да нормализирате DATETIME
, за да включва само датата, или можете да добавите изчислени колони за DAY, MONTH и YEAR:
ALTER TABLE tblErrorLog
ADD ErrorDay AS DAY(ErrorDate) PERSISTED
ALTER TABLE tblErrorLog
ADD ErrorMonth AS MONTH(ErrorDate) PERSISTED
ALTER TABLE tblErrorLog
ADD ErrorYear AS YEAR(ErrorDate) PERSISTED
и тогава можете да зададете заявка по-лесно:
select * from tblErrorLog
where ErrorMonth = 5 AND ErrorYear = 2009
и т.н. Тъй като тези полета са изчислени и ПОСТОЯННИ, те винаги са актуални и винаги актуални, и тъй като се запазват, можете дори да ги индексирате, ако е необходимо.
Не казвате коя база данни използвате, но в MS SQL Server ще бъде
WHERE DateField = {d '2008-12-20'}
Ако това е поле за клеймо за време, тогава ще ви трябва диапазон:
WHERE DateField BETWEEN {ts '2008-12-20 00:00:00'} AND {ts '2008-12-20 23:59:59'}
Ако приемем, че говорим за SQL Server DateTime
Забележка: BETWEEN включва двата края на диапазона, така че технически този модел ще бъде грешен:
errorDate BETWEEN '12/20/2008' AND '12/21/2008'
Предпочитаният от мен метод за период от време като този е:
'20081220' <= errorDate AND errordate < '20081221'
Работи с общи индекси (сканиране на диапазон, SARGable, без функции) и правилно изрязва полунощ на следващия ден, без да разчита на детайлността на времето на SQL Server (напр. 23:59:59.997)
Използвайте функция за конвертиране, за да получите всички записи за определен ден.
Select * from tblErrorLog where convert(date,errorDate,101) = '12/20/2008'
Вижте CAST и CONVERT за повече информация
yyyy-MM-dd
работи при повечето обстоятелства, но не при всички. @onupdatecascade: Прав си. Актуализирах отговора си, за да използвам формат, безопасен при всички обстоятелства.
- person LukeH; 23.12.2009
errorDate
? - person OMG Ponies   schedule 22.12.2009