Текущий архив: 2002.06.13;
Скачать: CL | DM;
Вниз
Вопрос по выборке с датами MSSQL Найти похожие ветки
← →
kserg@ukr.net (2002-05-13 19:31) [0]в таблице есть поле 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-е число.
Так понимаю, что всю малину портят часы:минуты.
Как объехать?
← →
icu (2002-05-13 19:36) [1]SELECT * FROM Table WHERE dat1 <= :dateto AND dat1 >= :datefrom
что-то типа этого. Дата - это простой Double. То есть число дней прошедших с 12/30/1899. Вот и все. А сейчас ты с ней как со строкой работаешь.
← →
kserg@ukr.net (2002-05-13 19:47) [2]>icu (13.05.02 19:36)
Уважаемый, если правильно понял, вы предлагаете реализацию запроса из ДЕЛФей.
Я всегда отрабатываю запросы в SQLServer Manager.
Там и заметил столь странный для меня рез-т.
Попробовал тупо
...WHERE Dat1 BETWEEN CAST("06.05.02" AS smalldatetime)
AND CAST("12.05.02" AS smalldatetime)
рез-т тотже - запись 12.05.02 08:00:00 не выбирается.
← →
kserg@ukr.net (2002-05-13 19:50) [3]Вот в ходе обсуждения хочу уточнить вопрос:
как в запросе работать только с "чистой" датой?
т.е. откинуть составляющую времени
← →
Delirium (2002-05-13 19:56) [4]Я делаю так:
select * from dDate between "20020502" and "20020502 23:59:59"
← →
kserg@ukr.net (2002-05-13 20:00) [5]>Delirium © (13.05.02 19:56)
спасибо, принимается :)
А всё таки, не уже ли нельзя откинуть время и работать только с датами?
← →
icu (2002-05-13 20:19) [6]А так нельзя -
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)
?
← →
icu (2002-05-15 15:14) [7]Народ,
так устраивает или нет такая схема? ;-)
← →
wicked (2002-05-15 15:22) [8]не устраивает... дата так просто в инт не кастится...
← →
Reindeer Moss Eater (2002-05-15 15:49) [9]Если использовать CAST и прочие преобразования, то индексы по этому полю отдыхают.
Лучше с клиента передать дату с нужным временем
← →
icu (2002-05-15 15:53) [10]2wicked:
Я привел пример реального запроса. Он работает. Просто, судя по всему, нет другого способа... По крайней мере когда нужно быстро выполнить запрос... =(
← →
DmitryK (2002-05-15 18:20) [11]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"
т.е. использовать строгое отношение
← →
kserg@ukr.net (2002-05-15 18:58) [12]>DmitryK (15.05.02 18:20)
Браво!!! Как я сам не додумался?
Вот что значит сила привычки - давно перешел к BETWEEN
а когда в FOX-e ведь так и работал
Эх, летит же времечко :(
← →
Fay (2002-05-16 03:29) [13]2isu
Не гони!!
Почитай, как хранится datetime в MSSQL
← →
icu (2002-05-16 08:24) [14]2Fay:
А что именно не устраивает?
← →
Gefest (2002-05-16 09:45) [15]Может я предлгаю не самый лучший способ, но все же
есть такие хороший функции 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
По пробуй с ними поработать :)
← →
kva (2002-05-16 09:54) [16]2Gefest
Но как заметил Reindeer Moss Eater
>Если использовать CAST и прочие преобразования, то индексы по
>этому полю отдыхают.
Мне кажется способ DmitryK
SELECT * FROM Table WHERE dat1>="06.05.02" AND dat1<"13.05.02"
лучше
← →
Johnmen (2002-05-16 09:56) [17]Ну вы все и нагнали из-за пустой проблемы !!!
Поясню :
в выборке... AND "12.05.02"
есть "12.05.02 00:00:00", что, естественно, меньше "12.05.02 08:00:00" !!!
← →
alexnik (2002-05-16 10:02) [18]В 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)
← →
SergSuper (2002-05-17 10:13) [19]ой как всё запущено
насчет образания даты
Делать так, как предлагает 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
← →
Fay (2002-05-17 21:07) [20]2isu
>Дата - это простой Double
Я же сказал - почитай.
← →
Fay (2002-05-17 21:16) [21]Это
select distinct
DT = convert(datetime, substring(convert(binary(8), [Твоя дата]), 1, 4)+0x00000000)
from [Твоя табла]
← →
yozhik (2002-05-21 10:47) [22]Для решения похожей проблемы я использую следующее:
WHERE DAT>=@Dat1 and DAT<@Dat2+1, где @Dat1 - начальная дата, а @DAT2 - конечная, в даном случае @Dat1="06.05.02" и @Dat2="12.05.02"
← →
yozhik (2002-05-21 10:48) [23]Для решения похожей проблемы я использую следующее:
WHERE DAT>=@Dat1 and DAT<@Dat2+1
, где @Dat1 - начальная дата, а @DAT2 - конечная, в даном случае @Dat1="06.05.02" и @Dat2="12.05.02"
← →
Polevi (2002-05-21 12:51) [24]CREATE FUNCTION DateOnly(@DateTime DATETIME)
RETURNS DATETIME
AS
BEGIN
Return(Floor(Convert(Float,@DateTime)))
END
Страницы: 1 вся ветка
Текущий архив: 2002.06.13;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.005 c