Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.06.13;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по выборке с датами 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.005 c
7-40190
Comwad
2001-10-10 12:58
2002.06.13
Защита CD-R от копирования


1-40081
Goblinus
2002-06-02 20:58
2002.06.13
RichEdit


3-39930
111111111111
2002-05-20 09:35
2002.06.13
Разное


14-40159
Alex_Nik
2002-05-08 16:29
2002.06.13
Help !!!


4-40201
nikulin
2002-04-10 19:28
2002.06.13
Как вызвать функцию API NetMessageBufferSend??





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский