![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по выборке с датами MSSQL
kserg@ukr.net © (2002-05-13 19:31:00)в таблице есть поле dat1 - тип SmallDateTime
dat1
06.05.02
11.05.02
12.05.02
12.05.02 08:00:00
13.05.02
Мне надо выбрать все даты с 6 по 12 мая
След.запрос выбирает всё, кроме 12.05.02 08:00:00
SELECT * FROM Table WHERE dat1 BETWEEN "06.05.02" AND "12.05.02"
!!НО - меняю на
SELECT * FROM Table WHERE dat1 BETWEEN "06.05.02" AND "13.05.02"
запись 12.05.02 08:00:00 выбирается тоже,
и вместе с этим выбирается и 13-е число.
Так понимаю, что всю малину портят часы:минуты.
Как объехать?
Polevi (2002-05-21 12:51:00) [1]CREATE FUNCTION DateOnly(@DateTime DATETIME)
RETURNS DATETIME
AS
BEGIN
Return(Floor(Convert(Float,@DateTime)))
END
yozhik (2002-05-21 10:48:00) [2]Для решения похожей проблемы я использую следующее:
WHERE DAT>=@Dat1 and DAT<@Dat2+1, где @Dat1 - начальная дата, а @DAT2 - конечная, в даном случае @Dat1="06.05.02" и @Dat2="12.05.02"
yozhik (2002-05-21 10:47:00) [3]Для решения похожей проблемы я использую следующее:
WHERE DAT>=@Dat1 and DAT<@Dat2+1, где @Dat1 - начальная дата, а @DAT2 - конечная, в даном случае @Dat1="06.05.02" и @Dat2="12.05.02"
Fay (2002-05-17 21:16:00) [4]Это
select distinct
DT = convert(datetime, substring(convert(binary(8), [Твоя дата]), 1, 4)+0x00000000)
from [Твоя табла]
Fay (2002-05-17 21:07:00) [5]2isu
>Дата - это простой Double
Я же сказал - почитай.
SergSuper (2002-05-17 10:13:00) [6]ой как всё запущено
насчет образания даты
Делать так, как предлагает icu - конвертить в int и обратно - нельзя, из этого примера видно почему:
declare @t table(d datetime)
insert @t select "20010101"
insert @t select "20010101 10:00"
insert @t select "20010101 14:00"
select d, cast(d as int) from @t
но можно делать так:
select d, cast(floor(cast(d as float)) as datetime) from @t
еще можно делать по честному, так когда-то рекомендовала MS:
select d, convert(datetime,(convert(varchar(33),d,103),103) from @t
А функцию Gefest написал сильную, жалко не у всех есть таблицы
Rasp, turn, season
alexnik (2002-05-16 10:02:00) [7]В MSSQL есть ф-ции DAY,MONTH,YEAR,HOUR,MIN для работы с датой.
Для данного вопроса это, конечно, применять не стоит (WHERE dat1>="06.05.02" AND dat1<"13.05.02" - отлично подойдёт), но можно и так:
Select * From Table where (year(dat1)=2002) and (month(dat1)=5) and (day(dat1) BETWEEN 6 and 12)
Johnmen (2002-05-16 09:56:00) [8]Ну вы все и нагнали из-за пустой проблемы !!!
Поясню :
в выборке... AND "12.05.02"есть "12.05.02 00:00:00", что, естественно, меньше "12.05.02 08:00:00" !!!
kva (2002-05-16 09:54:00) [9]2Gefest
Но как заметил Reindeer Moss Eater
>Если использовать CAST и прочие преобразования, то индексы по
>этому полю отдыхают.
Мне кажется способ DmitryK
SELECT * FROM Table WHERE dat1>="06.05.02" AND dat1<"13.05.02"
лучше
Gefest (2002-05-16 09:45:00) [10]Может я предлгаю не самый лучший способ, но все же
есть такие хороший функции day и mounth, которые вычленяют
из smalldatetime день и месяц соответсвенно.
Вот примерчик как с ними работать
FUNCTION GetNextGameDate (@date smalldatetime,@idSeason int)
RETURNS varchar(10) AS
BEGIN
declare @GetDate varchar(10)
declare @Month int
if (select @idSeason)=0
begin
select top 1 @GetDate=convert(varchar(10),month(Gamedate))
+"."+convert(varchar(10),day(GameDate))
+"."+convert(varchar(10),Year(GameDate))
from Rasp where GameDate<@date
order by GameDate desc
end
else
begin
select top 1 @GetDate=convert(varchar(10),month(Gamedate))
+"."+convert(varchar(10),day(GameDate))
+"."+convert(varchar(10),Year(GameDate))
from Rasp r,turn t, season s
where r.GameDate<@date and t.idTurn=r.idTurn and s.idSeason=t.idseason
and s.idseason=@idseason
order by GameDate desc
end
Return @GetDate
END
По пробуй с ними поработать :)
icu (2002-05-16 08:24:00) [11]2Fay:
А что именно не устраивает?
Fay (2002-05-16 03:29:00) [12]2isu
Не гони!!
Почитай, как хранится datetime в MSSQL
kserg@ukr.net (2002-05-15 18:58:00) [13]>DmitryK (15.05.02 18:20)
Браво!!! Как я сам не додумался?
Вот что значит сила привычки - давно перешел к BETWEEN
а когда в FOX-e ведь так и работал
Эх, летит же времечко :(
DmitryK (2002-05-15 18:20:00) [14]BETWEEN - выбирает значения между двумя границами, А ТАКЖЕ значения равные этим границам
т.е. запрос SELECT * FROM Table WHERE dat1 BETWEEN "06.05.02" AND "13.05.02" будет выдавать значения которые больше либо равны 06.05.02 и меньше либо равны 13.05.02 (включая и 13.05.02 00:00). Если последнюю дату надо исключить, то надо просто правильно построить запрос:
SELECT * FROM Table WHERE dat1>="06.05.02" AND dat1<"13.05.02"
т.е. использовать строгое отношение
icu (2002-05-15 15:53:00) [15]2wicked:
Я привел пример реального запроса. Он работает. Просто, судя по всему, нет другого способа... По крайней мере когда нужно быстро выполнить запрос... =(
Reindeer Moss Eater (2002-05-15 15:49:00) [16]Если использовать CAST и прочие преобразования, то индексы по этому полю отдыхают.
Лучше с клиента передать дату с нужным временем
wicked (2002-05-15 15:22:00) [17]не устраивает... дата так просто в инт не кастится...
icu (2002-05-15 15:14:00) [18]Народ,
так устраивает или нет такая схема? ;-)
icu (2002-05-13 20:19:00) [19]А так нельзя -
select
agr_date_of_agreement
from
common_agreement_form
where
cast(agr_date_of_agreement as integer) <= cast(cast("05.13.02" as datetime) as integer)
?
kserg@ukr.net (2002-05-13 20:00:00) [20]>Delirium © (13.05.02 19:56)
спасибо, принимается :)
А всё таки, не уже ли нельзя откинуть время и работать только с датами?