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

Откуда:
Сообщений: 46
Добрый день.
Есть колонка с временем в формате unixtimestamp, необходимо сделать выборку за текущий день и за текущий месяц.
Заранее спасибо.
29 окт 18, 11:56    [21717833]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ну начало времен в юниксе ето
(1970, 1, 1, 0, 0, 0, 0)
чтоб получить сегодня или завтра просто добавте необходимое количество секунд к "началу времен"
29 окт 18, 12:16    [21717851]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
Евгений.
Добрый день.
Есть колонка с временем в формате unixtimestamp, необходимо сделать выборку за текущий день и за текущий месяц.
Заранее спасибо.
Что за колонка? Какого типа?
Да и как поле называется и таблица? Хотя бы.

Примерно так:

WHERE DATEADD(SECOND, колонка, '1970')>=CAST(CURRENT_TIMESTAMP AS DATE)
  AND DATEADD(SECOND, колонка, '1970')<DATEADD(DAY,1,CAST(CURRENT_TIMESTAMP AS DATE))

WHERE DATEADD(SECOND, колонка, '1970')>=DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP),0)
  AND DATEADD(SECOND, колонка, '1970')< DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP)+1,0)
29 окт 18, 12:16    [21717854]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
За текущий день:
[колонка с временем в формате unixtimestamp] >= datediff(second, '1970', cast(getdate() as date)) and
[колонка с временем в формате unixtimestamp] < datediff(second, '1970', dateadd(day, 1, cast(getdate() as date)))
За месяц сделаете сами по аналогии.
29 окт 18, 12:21    [21717858]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
Евгений.
Member

Откуда:
Сообщений: 46
Maxx
ну начало времен в юниксе ето
(1970, 1, 1, 0, 0, 0, 0)
чтоб получить сегодня или завтра просто добавте необходимое количество секунд к "началу времен"

Логика то понятна как, а вот как именно реализовать это на практике, в этом сложность.
29 окт 18, 12:23    [21717862]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
Евгений.
Member

Откуда:
Сообщений: 46
iap
Евгений.
Добрый день.
Есть колонка с временем в формате unixtimestamp, необходимо сделать выборку за текущий день и за текущий месяц.
Заранее спасибо.
Что за колонка? Какого типа?
Да и как поле называется и таблица? Хотя бы.

Примерно так:

WHERE DATEADD(SECOND, колонка, '1970')>=CAST(CURRENT_TIMESTAMP AS DATE)
  AND DATEADD(SECOND, колонка, '1970')<DATEADD(DAY,1,CAST(CURRENT_TIMESTAMP AS DATE))

WHERE DATEADD(SECOND, колонка, '1970')>=DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP),0)
  AND DATEADD(SECOND, колонка, '1970')< DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP)+1,0)

Как бы как именно у меня называется не думаю что сильно важно, но вот:
Тип int
Имя: dateTimeConnect
Таблица: dbo.CDR
Время хранится в секундах, прошедших с 1970 года. Например, 1523450956
29 окт 18, 12:28    [21717869]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
invm
За текущий день:
[колонка с временем в формате unixtimestamp] >= datediff(second, '1970', cast(getdate() as date)) and
[колонка с временем в формате unixtimestamp] < datediff(second, '1970', dateadd(day, 1, cast(getdate() as date)))

За месяц сделаете сами по аналогии.
Да. Преобразовать добавление секунд к '1970' слева от знака равенства
к разнице в секундах между '1970' и датой справа от знака равенства - это очень правильно.
Если по юниксовой колонке есть индекс, конечно.
29 окт 18, 12:30    [21717871]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
Евгений.
iap
пропущено...
Что за колонка? Какого типа?
Да и как поле называется и таблица? Хотя бы.

Примерно так:

WHERE DATEADD(SECOND, колонка, '1970')>=CAST(CURRENT_TIMESTAMP AS DATE)
  AND DATEADD(SECOND, колонка, '1970')<DATEADD(DAY,1,CAST(CURRENT_TIMESTAMP AS DATE))


WHERE DATEADD(SECOND, колонка, '1970')>=DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP),0)
  AND DATEADD(SECOND, колонка, '1970')< DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP)+1,0)


Как бы как именно у меня называется не думаю что сильно важно, но вот:
Тип int
Имя: dateTimeConnect
Таблица: dbo.CDR
Время хранится в секундах, прошедших с 1970 года. Например, 1523450956
Как оно хранится, тут и так все знают.
Раз сразу имена не написали, - придётся их прописывать в уже данных ответах самому.
29 окт 18, 12:32    [21717875]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
Евгений.
Member

Откуда:
Сообщений: 46
iap
Как оно хранится, тут и так все знают.
Раз сразу имена не написали, - придётся их прописывать в уже данных ответах самому.

Народ тут опытный, поэтому и не стал давать тут лишнюю информацию, как колонки называются и т.п.
Но раз уж спросили, то и написал.

За варианты спасибо.

Единственно вопрос.
Предложено 2 варианта, через DATEADD и datediff.
Если оба варианта рабочие, то мне кажется через datediff sql серверу придется делать меньше вычислений и лучше выбрать этот способ?
29 окт 18, 12:43    [21717889]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
Евгений.
Member

Откуда:
Сообщений: 46
iap
invm
За текущий день:
[колонка с временем в формате unixtimestamp] >= datediff(second, '1970', cast(getdate() as date)) and
[колонка с временем в формате unixtimestamp] < datediff(second, '1970', dateadd(day, 1, cast(getdate() as date)))

За месяц сделаете сами по аналогии.
Да. Преобразовать добавление секунд к '1970' слева от знака равенства
к разнице в секундах между '1970' и датой справа от знака равенства - это очень правильно.
Если по юниксовой колонке есть индекс, конечно.

Индексов нет по колонке с временем.
Тогда лучше как тут предложено все вычисления делать справа от знаков сравнения?
29 окт 18, 12:58    [21717909]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
да просто вычислите 1 раз в переменные и подставте в запрос
29 окт 18, 13:00    [21717913]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
Евгений.
Member

Откуда:
Сообщений: 46
Вопросов больше нет.
Все работает.
Спасибо.
29 окт 18, 13:01    [21717914]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
Евгений.
Member

Откуда:
Сообщений: 46
Maxx
да просто вычислите 1 раз в переменные и подставте в запрос

Хорошая идея. Спасибо.
29 окт 18, 13:02    [21717916]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
Maxx
да просто вычислите 1 раз в переменные и подставте в запрос
Выражения на основе getdate() и без участия каких-либо столбцов, считаются константными и вычисляются в запросе один раз.
29 окт 18, 13:07    [21717922]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать запрос с unixtimestamp  [new]
Евгений.
Member

Откуда:
Сообщений: 46
invm
Maxx
да просто вычислите 1 раз в переменные и подставте в запрос
Выражения на основе getdate() и без участия каких-либо столбцов, считаются константными и вычисляются в запросе один раз.

Согласен, иначе бы это был большой косяк.
Но вынести в переменную думаю можно хотя бы для удобочитаемости кода.
Т.к. время у меня понятно что не единственный параметров для выборки и строка запроса довольно большая.
29 окт 18, 13:18    [21717929]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить