Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Выборка за диапазон времени  [new]
Wlr-l
Member

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

Собственно, ...DATEPART(weekday... и ...%7... - это и есть день недели.

Т.е. Вы рассматриваете 1-й вариант, когда интервал целиком лежит в пределах одних суток.

2-й и 2-1 варианты интереснее. В них вся сложность.
7 окт 14, 16:21    [16672114]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Wlr-l
DATEPART(weekday... - это и есть день недели
Что Вы говорите!
Повторю:
SET DATEFIRST 1;
SELECT DATEPART(WEEKDAY,GETDATE());
SET DATEFIRST 2;
SELECT DATEPART(WEEKDAY,GETDATE());
SET DATEFIRST 3;
SELECT DATEPART(WEEKDAY,GETDATE());
SET DATEFIRST 4;
SELECT DATEPART(WEEKDAY,GETDATE());
SET DATEFIRST 5;
SELECT DATEPART(WEEKDAY,GETDATE());
SET DATEFIRST 6;
SELECT DATEPART(WEEKDAY,GETDATE());
SET DATEFIRST 7;
SELECT DATEPART(WEEKDAY,GETDATE());

Wlr-l
Т.е. Вы рассматриваете 1-й вариант, когда интервал целиком лежит в пределах одних суток.
Да нет. Вообще ничего не рассматриваю.
Просто мысли вслух.
Однако, если к одному и тому же времени в одном и том же дне недели, но в разных неделях,
отнять/прибавить одни и те же 30 минут, то получатся правильные диапазоны для дат со временем, не находите?
7 окт 14, 16:30    [16672181]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
iap,
Нахожу, только бы пример привести, без "как-то так", "типа". Попытки уже были, но результат не получен.

SET DATEFIRST 1;
SELECT DATEPART(WEEKDAY,GETDATE());
SET DATEFIRST 2;
SELECT DATEPART(WEEKDAY,GETDATE());


Что Вы доказали? Сместили точку отсчета? Если задать смещение и для всех дат найти день недели, то в рамках данной задачи ничего не изменится.
7 окт 14, 16:40    [16672292]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Wlr-l
iap,
Нахожу, только бы пример привести, без "как-то так", "типа". Попытки уже были, но результат не получен.

SET DATEFIRST 1;
SELECT DATEPART(WEEKDAY,GETDATE());
SET DATEFIRST 2;
SELECT DATEPART(WEEKDAY,GETDATE());



Что Вы доказали? Сместили точку отсчета? Если задать смещение и для всех дат найти день недели, то в рамках данной задачи ничего не изменится.
Я доказал подную бесполезность функции DATEPART(WEEKDAY,GETDATE()),
которая возвращает не пойми что.
Да. Для данной задачи действительно годится - врёт одинаково с обеих сторон от знака равенства.
7 окт 14, 16:43    [16672315]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
Wlr-l
Member

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

Я предложил способ решения задачи.
Способа решения задачи с использованием
...
where ...DATEPART(WEEKDAY,...

или
...
where ...%7...

пока еще нет!
7 окт 14, 16:51    [16672389]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
Wlr-l
Member

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

О бесполезности и вранье функции DATEPART(WEEKDAY,GETDATE()).
В чем же заключается бесполезность и вранье? Наверно в функции GETDATE, которая является недетерминированной функцией. Т.е. два последовательных вызова этой функции могут вернуть разные результаты. Поэтому, если в выражении функция GETDATE используется, например, два раза, то вполне возможно, что на границе суток (смены дат) первый вызов даст некоторую дату, а второй вызов даст следующую дату. Функция DATEPART при заданной точке отсчета дней недели (SET DATEFIRST х) честно определит день недели и в первом и во втором случае. И не ее вина, что полученные значения будут не одинаковыми. Это вина программиста, использующего такую конструкцию.
8 окт 14, 15:04    [16676848]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
Glory
Member

Откуда:
Сообщений: 104751
Wlr-l
Поэтому, если в выражении функция GETDATE используется, например, два раза, то вполне возможно, что на границе суток (смены дат) первый вызов даст некоторую дату, а второй вызов даст следующую дату.

Вы хоть проверяте то, о чем говорите ?
select getdate(), getdate(), getdate()
from sysobjects
8 окт 14, 15:10    [16676894]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Wlr-l
О бесполезности и вранье функции DATEPART(WEEKDAY,GETDATE()).
В чем же заключается бесполезность и вранье? Наверно в функции GETDATE, которая является недетерминированной функцией
Нет. Из-за зависимости от SET DATEFIRST или SET LANGUAGE
8 окт 14, 15:10    [16676895]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
Glory,
Конечно, и даже читаю документацию. Что означает слово недетерминированная по отношению к getdate?
8 окт 14, 16:54    [16677679]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
iap,
Еще раз, если зафиксировать точку отсчета дней недели в пределах пакета, то DATEPART(WEEKDAY... всегда для одной и той же даты вернет одно и тоже числовое значение дня недели.

Конечно, можно менять точку отсчета в пределах пакета и удивляться результатам.

В большинстве задач неважно имеет среда числовой код 3 или 5, или 10003, важно, чтобы все среды имели один и тот же числовой код. Возможно обработка будет немного разная. Ведь живут люди, у которых неделя начинается в воскресенье, и живут люди, у которых неделя начинается в понедельник.
8 окт 14, 17:02    [16677736]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Wlr-l
В большинстве задач неважно имеет среда числовой код 3 или 5, или 10003, важно, чтобы все среды имели один и тот же числовой код.
iap
Да. Для данной задачи действительно годится - врёт одинаково с обеих сторон от знака равенства.
Всё. Больше не могу.
8 окт 14, 17:20    [16677869]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
Wlr-l
Member

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

Спасибо за беседу!

Да и ТС пропал.
8 окт 14, 17:23    [16677884]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
Glory
Member

Откуда:
Сообщений: 104751
Wlr-l
Glory,
Конечно, и даже читаю документацию. Что означает слово недетерминированная по отношению к getdate?

У вас удивительное качество - отвечать не те вопросы, что вам задают.
Я вас спросил вовсе не о том, читаете ли документацию и тем более не про не/детеменированность getdate
8 окт 14, 19:28    [16678479]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Wlr-l
Что означает слово недетерминированная по отношению к getdate?




Значит, чтобы при каждом новом вызове при тех же параметрах (или без параметров как здесь) результат может не повторяться.

Например, +, ABS, SIN, HashBytes -- это детерминированные функции. Дай им одинаковые параметры на вход они дадут один и тот же результат. А GETDATE(), NEWID() недетерминированные.

детерминированный -- значит строго определенный, точно предсказуемый.
8 окт 14, 19:36    [16678509]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
vikkiv
Member

Откуда: EU
Сообщений: 2960
Кто-то там парится на верху ветки о том что getdate() каждый раз возвращает разное, банальное решение ведь
declare @d as datetime=getdate()
select datepart(d,@d)
select datepart(w,@d)
select datepart(m,@d)

или нет?
8 окт 14, 22:49    [16679237]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
vikkiv
Member

Откуда: EU
Сообщений: 2960
в смысле в пределах одного батча вся серия будет возвращать одинаковые значения
...select datepart(ms,@d)
select datepart(ms,@d)
select datepart(ms,@d)
select datepart(ms,@d)
А несчёт детерменироцанности - смотря в каком контексте и как применять, очень даже детерменированная, т.к. наверняка возвращает в момент чтения данные дата/время системы, если в разных кусках кода применять естественно резултаты разные будут т.к. чтение системного состояния происходит в момент времени t+n против первишного обращения в момент времени t , где n время на исполнение промежуточного кода/задержка, так что и в этом плане предсказуемость налицо.
8 окт 14, 22:58    [16679264]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
o-o
Guest
Wlr-l, вы дополняете вроде бы истинное выражение такими подробностями, что вообще непонятно, ОТКУДА такое взялось.
смотрите.
Nondeterministic functions are functions that are not guaranteed to return the same output when invoked multiple times with the same input.
вроде вы начинаете правильно (см. выделенное жирным)
Wlr-l
В чем же заключается бесполезность и вранье? Наверно в функции GETDATE, которая является недетерминированной функцией. Т.е. два последовательных вызова этой функции могут вернуть разные результаты. Поэтому, если в выражении функция GETDATE используется, например, два раза, то вполне возможно, что на границе суток (смены дат) первый вызов даст некоторую дату, а второй вызов даст следующую дату.

но ГДЕ ВЫ ВЫЧИТАЛИ, что В ОДНОМ ВЫРАЖЕНИИ, или даже просто В ОДНОМ ЗАПРОСЕ 2 вызова ф-ции дадут разный результат?
оставьте уже в покое Glory как личность, вы НЕ НА ТОМ ФОКУСИРУЕТЕСь, на код его смотрите, он же вам прямым текстом указывает, где у вас бред написан:
Glory
Вы хоть проверяте то, о чем говорите ?
select getdate(), getdate(), getdate()
from sysobjects

Wlr-l
Glory,
Конечно, и даже читаю документацию

ну какое "конечно"-то, возьмите и выполните код, ведь дело-то секундное!

давайте еще больше вас удивлю.
возьмите табличку побольше, чтоб читалась подольше,
сделайте
select *, getdate() from big_table

пусть в таблице 10 млн записей, убедитесь, что ВСЕ 10 МЛН. СТРОК БУДУТ ИМЕТь ОДНО И ТО ЖЕ ЗНАЧЕНИЕ getdate().

а главное, ну документировано же все это:
When you invoke nondeterministic built-in functions in a query (such as RAND and GETDATE), those functions are invoked once for the whole query and not once per row. The only exception to this rule is the NEWID function, which generates a globally unique identifier (GUID). NEWID is the only nondeterministic built-in function that will be invoked once per row.
8 окт 14, 23:06    [16679279]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
o-o
Guest
vikkiv
А несчёт детерменироцанности - смотря в каком контексте и как применять, очень даже детерменированная


GETDATE (Transact-SQL)

К сообщению приложен файл. Размер - 15Kb
8 окт 14, 23:12    [16679298]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
vikkiv
Member

Откуда: EU
Сообщений: 2960
o-o, Guest
да, согласен, против того что вы привели не возразишь, однако надпись на сайте микрософта не отменяет её детерминированности в семантике/определении приведённым ворониным (которое является более общим понятием детерминированности).. хотя это наверное ни о чём
8 окт 14, 23:19    [16679325]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
o-o
Guest
vikkiv
надпись на сайте микрософта не отменяет её детерминированности в семантике/определении приведённым ворониным


когда a_voronin выпустит свой сервер, вы с ним будете обсуждать его определение детерминированности, ок?
а топик Microsoft SQL Server оставьте уж тем, кто пользуется Microsoft-овским продуктом и Microsoft-овскими же определениями, please.

...но спасибо за плакатец для сортира, давно пора обновить содержимое рамки you made my day
8 окт 14, 23:33    [16679351]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
vikkiv
Member

Откуда: EU
Сообщений: 2960
ну и ладно, а для ламеров таких как я, проверочный кривокод
declare @d table(i int identity,d int);declare @i int=0;
while @i<=10000 begin insert into @d(d) select datepart(ms,getdate());set @i=@i+1 end
select varp(d)var,max(d)max,min(d)min from @d
select*from @d

ответ: результат явно будет разный
8 окт 14, 23:51    [16679398]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
o-o
Guest
vikkiv
ну и ладно, а для ламеров таких как я, проверочный кривокод
declare @d table(i int identity,d int);declare @i int=0;
while @i<=10000 begin insert into @d(d) select datepart(ms,getdate());set @i=@i+1 end
select varp(d)var,max(d)max,min(d)min from @d
select*from @d

ответ: результат явно будет разный

это сейчас что было?
вы сами себе доказываете, что GETDATE -- недетерминированная ф-ция?
вот честно, я не знаю, на каком языке повторить:
ОДИН РАЗ на весь запрос (ОДИН ЗАПРОС!!!!) вычисляется значение системных недетерминированных ф-ций (за исключением NEWID)
в вашем цикле СКОЛьКО запросов?
когда В КУЧЕ запросов КУЧА ЖЕ разных значений одной и той же ф-ции, при том, что нет или не меняли значение параметра, это и есть НЕДЕТЕРМИНИРОВАННОСТь

Deterministic functions always return the same result any time they are called with a specific set of input values and given the same state of the database. Nondeterministic functions may return different results each time they are called with a specific set of input values even if the database state that they access remains the same. For example, the function AVG always returns the same result given the qualifications stated above, but the GETDATE function, which returns the current datetime value, always returns a different result.
9 окт 14, 00:25    [16679526]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
vikkiv
Member

Откуда: EU
Сообщений: 2960
o-o,

я с вами вовсе не спорю, AVG проведёт одинаковый результат из одинаковых данных, с getdate такая-же хрень, если считает одинаковую системную переменную - будет одинаковый результат, считает разные данные - на выходе будет другой результат.

в общем не вижу предмета спора, разговор ни о чём, с вами согласился сразу - у микрософта написанно детерминированная - пусть будет детерминированная, система координат заданна и останемся в ней, поздний вечер уже, у мну моск не работает или работает в каком-то другом граничном измерении..

извиняюсь, тему не читал а только верхний кусок 2й страницы , на то что увидел и выдал мнение, а до этого оказывается и задача совсем другая , я даже и вариант с переменной зачем-то проплагиатил =))
9 окт 14, 01:09    [16679612]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
aleks2
Guest
o-o
[
ОДИН РАЗ на весь запрос (ОДИН ЗАПРОС!!!!) вычисляется значение системных недетерминированных ф-ций (за исключением NEWID)


Нет. Getdate() и все недетерминированные функции (за вычетом RAND()) вызываются стока раз за запрос - скока нужно.
Т.е.
insert sometable
 select x, getdate()
   from ( values (1),(2),(3) ) as y(x)

вызовет getdate() три раза. И, в общем случае, вставит разные значения даты.

В 2000-м еще можно было заставить оптимизатор вызвать Getdate() раз, обернув ее в (select getdate())
insert sometable
 select x, gd
   from ( select 1 x union select 2 select 3 ) y cross join (select getdate() gd) z 

, но 2005 и 2008 плюют на этот фокус.
9 окт 14, 05:23    [16679721]     Ответить | Цитировать Сообщить модератору
 Re: Выборка за диапазон времени  [new]
o-o
Guest
щас обдумаю, в чем подвох со вставкой.
но что в селекте GETDATE() не вызывается строка за строкой, вот:
select DISTINCT GETDATE() AS dt
from dbo.Nums n1 cross join dbo.Nums n2;

в моем dbo.Nums 1000000 значений, делаю ему cross join на себя, хорошее число строк будет, да?
а вот такое счтается мгновенно, с чего бы вдруг?

К сообщению приложен файл. Размер - 5Kb
9 окт 14, 08:08    [16679842]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить