Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сравнение дат?  [new]
SiDen
Member

Откуда:
Сообщений: 518
Есть таблица

CREATE TABLE [dbo].[BillCycles] (
[BCID] [int] IDENTITY (1, 1) NOT NULL ,
[StartDate] [datetime] NOT NULL ,
[EndDate] [datetime] NOT NULL
) ON [PRIMARY]

Там две записи

2000000 01.07.2003 31.07.2003 23:59:59
2000002 01.08.2003 31.08.2003 23:59:59

Пишем запрос:

declare
@cur_date datetime
set @cur_date='20030801'
DECLARE
@b_cur_date datetime
SET @b_cur_date=@cur_date-1
select @b_cur_date
select * from BillCycles where @b_cur_date between StartDate and EndDate
select * from BillCycles where StartDate>=@b_cur_date and @b_cur_date<=EndDate


Получаем:
2003-07-31 00:00:00.000
2000000 2003-07-01 00:00:00.000 2003-07-31 23:59:59.000
2000002 2003-08-01 00:00:00.000 2003-08-31 23:59:59.000

Может всезнающий олл чего-нить подскажет...
ЗЫ: Win2000 AS+SP3 MSSQL2000+SP3
2 авг 03, 10:42    [286012]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
а че ты хотел? усе правильно....
StartDate>=@b_cur_date and @b_cur_date<=EndDate
2 авг 03, 11:19    [286022]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
SiDen
Member

Откуда:
Сообщений: 518
Что правильно?
2000002 2003-08-01 00:00:00.000 >= 2003-07-31 00:00:00.000 AND
2003-07-31 00:00:00.000 <= 2003-08-31 23:59:59.000
Истина???
2 авг 03, 11:25    [286024]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
SiDen
Member

Откуда:
Сообщений: 518
Сорри, верно
2 авг 03, 11:26    [286026]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
KOLCHOZ_POSTEVENT
Guest
Вы знаете,как даты представляются в кишках базы данных?
Я,например,нет.
Так зачем же применять побитовое сравнение >,< и.т.п.,да и between в этом случае сработал,а в другом может и заесть.
Я для сравнений дат доверяю только datediff,ибо,два значения из того-же дня могут дать "не равно" из-за секунд.
3 авг 03, 13:10    [286496]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145684
Вы гляньте, как Вы условие-то записали.

select * from BillCycles where StartDate>=@b_cur_date and @b_cur_date<=EndDate --????????????????????????


select * from BillCycles where @b_cur_date>=StartDate and @b_cur_date<=EndDate -- Надо-то так

3 авг 03, 16:01    [286538]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Вы знаете,как даты представляются в кишках базы данных?
Я,например,нет.


"Values with the datetime data type are stored internally by Microsoft SQL Server as two 4-byte integers. The first 4 bytes store the number of days before or after the base date, January 1, 1900. The base date is the system reference date. Values for datetime earlier than January 1, 1753, are not permitted. The other 4 bytes store the time of day represented as the number of milliseconds after midnight."

Так зачем же применять побитовое сравнение >,< и.т.п.,да и between в этом случае сработал,а в другом может и заесть.
Я для сравнений дат доверяю только datediff,ибо,два значения из того-же дня могут дать "не равно" из-за секунд.


Например, чтобы при запросе сервер смог использовать имеющиеся индексы по этим полям. А использованием datediff вы "запрещаете" серверу это делать.
4 авг 03, 10:18    [286797]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31202
2KOLCHOZ_POSTEVENT
Используемые в примере SiDen операции с датами - это документированные операции. Использование их так-же рискованно, как и datediff - ведь его поведение тоже M$ может в будущем изменить?

Единственно, я-бы не стал применять такое: SET @b_cur_date=@cur_date-1, тут лучьше dateadd

А остальные операции применять нужно и можно.
4 авг 03, 11:12    [286913]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Сравнение дат?  [new]
Saraby
Member

Откуда: Россия, Москва
Сообщений: 28
Люди, здрасте.
Скажите как мне сравнить дату из таблицы с текущей так, чтобы выбрать тех, у кого разница составляет больше 6-ти месяцев?
например вторая дата - текущая:

select datediff(mm,'03.16.2007','09.01.2007')

вернет 6 месяцев (т.е. сравнивает даты только по месяцам), а надо, чтобы еще и по дням сравнивала, т.е. ведь с 16 марта по 1 сентября прошло неполных 6 месяцев!
19 мар 07, 14:45    [3915156]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
...where MyDate < dateadd(mm, -6, getdate())
19 мар 07, 14:49    [3915170]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
Saraby
Member

Откуда: Россия, Москва
Сообщений: 28
tpg
...where MyDate < dateadd(mm, -6, getdate())


Большое спасибо. Оказалось это просто!
19 мар 07, 15:05    [3915263]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Сравнение дат?  [new]
skywriter
Member

Откуда:
Сообщений: 787
Кто знает, почему так:

SELECT MIN(CreationDate) FROM WeatherForecast WHERE SourceId=22
UNION
SELECT CONVERT(DATETIME,'2009.07.28 16:40:43',102)

Возвращает 2 одинаковых записи:
28.07.2009 16:40:43
28.07.2009 16:40:43

а вот так:

IF ((SELECT MIN(CreationDate) FROM WeatherForecast WHERE SourceId=22)=CONVERT(DATETIME,'2009.07.28 16:40:43',102)) SELECT 1
ELSE SELECT 0

Возвращает 0??!
30 июл 09, 09:17    [7476774]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
vino
Member

Откуда:
Сообщений: 1191
skywriter, а откуда известно, какого типа CreationDate в WeatherForecast
может вы сравниваете c миллисекундами?
например, MIN(CreationDate) вполне может быть с секундами, а ваш клиент их не показывает
30 июл 09, 09:29    [7476826]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
vino
Member

Откуда:
Сообщений: 1191
vino
skywriter, а откуда известно, какого типа CreationDate в WeatherForecast
может вы сравниваете c миллисекундами?
например, MIN(CreationDate) вполне может быть с миллисекундами, а ваш клиент их не показывает
30 июл 09, 09:30    [7476833]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
skywriter
Member

Откуда:
Сообщений: 787
vino,

Так оно и есть:

declare @dt1 DateTime
declare @dt2 DateTime
set @dt1=(SELECT MIN(CreationDate) FROM WeatherForecast WHERE SourceId=22)
set @dt2=(SELECT CONVERT(DATETIME,'2009.07.28 16:40:43',102))
select @dt1
union
select @dt2

select convert(float,@dt1)
union
select convert(float,@dt2)

возвращает разные числа.

А как заставить отображать миллисекунды в запросе "select @dt1" ?
30 июл 09, 09:33    [7476846]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
vino
skywriter, а откуда известно, какого типа CreationDate в WeatherForecast
может вы сравниваете c миллисекундами?
например, MIN(CreationDate) вполне может быть с секундами, а ваш клиент их не показывает
Это объяснение - единственно возможное, потому что UNION без ключевого слова ALL отбрасывает дубликаты.
Раз вернулось две строки, значит они чем-то отличаются.
30 июл 09, 09:34    [7476851]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
skywriter
А как заставить отображать миллисекунды в запросе "select @dt1" ?
Рекомендую использовать стиль 126 функции CONVERT. Это - стандарт ISO
30 июл 09, 09:40    [7476888]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
vino
Member

Откуда:
Сообщений: 1191
iap
skywriter
А как заставить отображать миллисекунды в запросе "select @dt1" ?
Рекомендую использовать стиль 126 функции CONVERT. Это - стандарт ISO
главное - нужно понять, какой клиент будет эти данные получать и отображать
если достаточно только показывать их, то преобразуйте в строку, как iap указал
30 июл 09, 09:44    [7476913]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
skywriter
Member

Откуда:
Сообщений: 787
Оказалось, что проблема возникла сразу в двух местах:
1) EMS SQL Manager 2005 не отображает миллисекунды в результате запроса:

SELECT MIN(CreationDate) FROM WeatherForecast WHERE SourceId=22
UNION
SELECT CONVERT(DATETIME,'2009.07.28 16:40:43',102)

Проверил в MS SQL Query Analyzer - тот вернул с миллисекундами.

2) При добыче данных из SqlReader объект DateTime конвертится в DataTable как строка без миллисекунд:

                SqlDataReader reader = cmd.ExecuteReader();
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    dtFcasts.Columns.Add(new DataColumn(reader.GetName(i)));
                }
                while (reader.Read())
                {
                    DataRow row = dtFcasts.NewRow();
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        row[i] = Convert.ToDateTime(reader[i]); // *** Здесь ***
                    }
                    dtFcasts.Rows.Add(row);
                }

Как правильно вернуть таблицу из SqlReader с сохранением типов?
30 июл 09, 10:21    [7477159]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
skywriter
Как правильно вернуть таблицу из SqlReader с сохранением типов?
Все форумы / C#.NET
30 июл 09, 10:27    [7477203]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат?  [new]
vino
Member

Откуда:
Сообщений: 1191
skywriter, если никаких преобразований не делать, тип datetime передается в .NET замечательно
хотя, есть проблемы, но только с поясным смещением при последующей конвертации
30 июл 09, 11:26    [7477751]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить