Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по выборке с датами MSSQL


Страницы:   1 2

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)
спасибо, принимается :)

А всё таки, не уже ли нельзя откинуть время и работать только с датами?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо