Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.012 c
1-40066
Arkan
2002-06-01 21:34
2002.06.13
Сортировка


1-40060
DeMoN-777
2002-06-01 21:36
2002.06.13
Задача ;)


3-39923
studentik
2002-05-20 16:11
2002.06.13
Возник вопрос: что лучше?


3-39927
RDA
2002-05-20 19:35
2002.06.13
Каскадные изменения


1-40078
gserg
2002-05-31 13:54
2002.06.13
!