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

Откуда:
Сообщений: 14
Запрос:

select
  _Period
from _AccRgAT25961
WHERE
  _Period >= '4013-02-01 00:00:00.000'
  AND _Period < '4013-02-02'

возвращает кучу строк такого вида:

4013-02-01 00:00:00.000
4013-02-01 00:00:00.000
4013-02-01 00:00:00.000
4013-02-01 00:00:00.000
...

А запрос:

select
  _Period
from _AccRgAT25961
WHERE
  _Period = '4013-02-01 00:00:00.000'

не возвращает ничего.

Как такое может быть?

Самое интересное, что запрос:

select
  _Period
from _AccRgAT25961
WHERE
  _Period >= '4013-02-01 23:59:59.999'
  AND _Period < '4013-02-02'

возвращает ровно те же строки...

К сообщению приложен файл. Размер - 26Kb
1 июл 15, 22:13    [17840373]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4422
А тип поля _Period у вас какой?
1 июл 15, 22:27    [17840398]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
SELECT _Period
FROM _AccRgAT25961
WHERE _Period >= '40130201'
  AND _Period < '40130202'
2 июл 15, 09:45    [17841593]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
Max Tarasov
Member

Откуда:
Сообщений: 14
SQL2008
А тип поля _Period у вас какой?
datetime
2 июл 15, 10:54    [17841905]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
Max Tarasov
Member

Откуда:
Сообщений: 14
iap
SELECT _Period
FROM _AccRgAT25961
WHERE _Period >= '40130201'
  AND _Period < '40130202'

Чем отличается от моего первого запроса?
Суть вопроса не в том, как все таки добиться получения данных, а почему не работает второй запрос.
2 июл 15, 10:55    [17841916]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
Glory
Member

Откуда:
Сообщений: 104751
Max Tarasov
datetime

'4013-02-01 23:59:59.999' - это 4013-02-02 00:00:00.000
2 июл 15, 10:56    [17841919]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
Max Tarasov
SQL2008
А тип поля _Period у вас какой?
datetime
Как думаете, '4013-02-01' - это 1 февраля или 2 января?
2 июл 15, 10:56    [17841925]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
Glory
Member

Откуда:
Сообщений: 104751
Max Tarasov
а почему не работает второй запрос.

Он работает

declare @t table(_Period datetime)
insert @t values('4013-02-01 00:00:00.000')
insert @t values('4013-02-01 00:00:00.000')
insert @t values('4013-02-02 00:00:00.000')

select * from @t where _period = '4013-02-01 00:00:00.000'
2 июл 15, 10:58    [17841937]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Max Tarasov
SQL2008
А тип поля _Period у вас какой?
datetime


я бы использовал convert и не устраивал ромашку ;-)
2 июл 15, 10:58    [17841939]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
Max Tarasov
Member

Откуда:
Сообщений: 14
iap
Max Tarasov
пропущено...
datetime
Как думаете, '4013-02-01' - это 1 февраля или 2 января?

Вы правы!

Запрос
select
  _Period
from _AccRgAT25961
WHERE
  _Period = '4013-01-02 00:00:00.000'

выводит строки
4013-02-01 00:00:00.000

Забавно...
2 июл 15, 11:04    [17841970]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
Glory
Member

Откуда:
Сообщений: 104751
Max Tarasov
Забавно...

Вы не знаете, что существует множество _смивольных_ представлений даты/времени ?
2 июл 15, 11:05    [17841978]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
Max Tarasov
Member

Откуда:
Сообщений: 14
Glory
Max Tarasov
Забавно...

Вы не знаете, что существует множество _смивольных_ представлений даты/времени ?

Теперь знаю. А не порекомендуете, как вывести дату, чтобы ее символьное представление не оставляло разночтения.
Поясню.
Если я налагаю условие
_Period >= '4013-01-02 00:00:00.000'
AND _Period < '4013-02-02'

то получаю две строки
4013-02-01 00:00:00.000
4013-02-01 00:00:00.000

Если же налагаю условие
_Period = '4013-01-02 00:00:00.000'

то получаю одну строка
4013-02-01 00:00:00.000

Делаю вывод, что в первом случае хотя и выглядят даты одинаковыми, но содержат разные значения.
2 июл 15, 11:32    [17842142]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
londinium
Member

Откуда: Киев
Сообщений: 1195
автор
А не порекомендуете, как вывести дату, чтобы ее символьное представление не оставляло разночтения

Я бы использовал YYYYMMDD (20150201)-1 февраля 2015 года
2 июл 15, 11:34    [17842158]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
Glory
Member

Откуда:
Сообщений: 104751
FAQ
2 июл 15, 11:35    [17842166]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
Max Tarasov
Glory
пропущено...

Вы не знаете, что существует множество _смивольных_ представлений даты/времени ?

Теперь знаю. А не порекомендуете, как вывести дату, чтобы ее символьное представление не оставляло разночтения.
Поясню.
Если я налагаю условие
_Period >= '4013-01-02 00:00:00.000'
AND _Period < '4013-02-02'


то получаю две строки
4013-02-01 00:00:00.000
4013-02-01 00:00:00.000
Если же налагаю условие
_Period = '4013-01-02 00:00:00.000'


то получаю одну строка
4013-02-01 00:00:00.000
Делаю вывод, что в первом случае хотя и выглядят даты одинаковыми, но содержат разные значения.
Я ж вроде написал уже.

Читайте внимательно здесь: https://msdn.microsoft.com/ru-ru/library/ms180878(v=sql.100).aspx
И местный FAQ
2 июл 15, 11:36    [17842183]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8488
Max Tarasov, дефисы в представлении даты из каких соображений? Еще один "интуитивный программист"...
2 июл 15, 11:52    [17842340]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
Владислав Колосов
Max Tarasov, дефисы в представлении даты из каких соображений? Еще один "интуитивный программист"...
Однако, если пробел между датой и временем просто заменить на букву T,
получится стандартный строковый формат (126), всегда однозначно интерпретирующийся без явного конвертирования.
2 июл 15, 12:08    [17842496]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2397
Max Tarasov
А запрос:

не возвращает ничего.

Как такое может быть?
.


set dateformat ymd
(перед запросом)
2 июл 15, 13:07    [17842930]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
Max Tarasov
Member

Откуда:
Сообщений: 14
Похоже, какие-то проблемы с индексом. Пока разбираюсь.
2 июл 15, 13:09    [17842942]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
StarikNavy
Max Tarasov
А запрос:

не возвращает ничего.

Как такое может быть?
.


set dateformat ymd
(перед запросом)
Это зачем такое, а?
А попробуйте это в функции или представлении написать!
2 июл 15, 13:09    [17842943]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4422
iap
Владислав Колосов
Max Tarasov, дефисы в представлении даты из каких соображений? Еще один "интуитивный программист"...
Однако, если пробел между датой и временем просто заменить на букву T,
получится стандартный строковый формат (126), всегда однозначно интерпретирующийся без явного конвертирования.

также без явного конвертирования и всегда однозначно (пока, по крайней мере для меня) вопринимается дата в формате
текста в виде 'YYYYMMDD'
Т.е.
 '20150702' 
2 июл 15, 13:10    [17842950]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение дат  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
SQL2008
iap
пропущено...
Однако, если пробел между датой и временем просто заменить на букву T,
получится стандартный строковый формат (126), всегда однозначно интерпретирующийся без явного конвертирования.

также без явного конвертирования и всегда однозначно (пока, по крайней мере для меня) вопринимается дата в формате
текста в виде 'YYYYMMDD'
Т.е.
 '20150702' 
А никто и не спорит!
Я и в этой теме об этом писал!

И даже ссылку на все подробности про даты в T-SQL дал
2 июл 15, 13:11    [17842967]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить