Получение данных из базы данных Sybase SQL с помощью скользящего окна - PullRequest
0 голосов
/ 09 октября 2018

Я хочу получить данные за три года из базы данных, но сейчас мне нужно указать даты в ряде разделов в моем коде, используя оператор Между:

BETWEEN '2015-10-01' AND '2018-09-30'

Поскольку база данных содержит толькодействительные данные за предыдущий месяц в обратном порядке, я хочу взять конец прошлого месяца и вернуться на три года назад.

Я нашел этот учебник, в котором автор показывает, как сделать это на SQL-сервере, и я пытался его адаптировать, но моя СУБД выдает ошибки в функции datediff

----Last Day of Previous Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
LastDay_PreviousMonth

Мой код выглядит следующим образом, но я вижу ошибку, заключающуюся в преобразовании 0 в дату.

DECLARE @date DATE
SET @date = getdate()

SELECT dateadd(second,-1,dateadd(mm, DATEDIFF(m,0,GETDATE()),0))

Если у кого-либо есть какие-либо предложения, я был бы очень признателен за ваше руководство.

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Не используйте between, и работа становится намного проще.Используйте меньше, чем первый день текущего месяца , который точно находит все до этой даты (вместо последнего дня предыдущего месяца).Вычтите 3 года с этой же даты и используйте> = в качестве начальной точки.

Select *
From yourtables
where datecol >= dateadd (year,-3,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0) )
And datecol < DATEADD(mm,DATEDIFF(m,0,GETDATE()),0) 

Пожалуйста, не используйте решение, использующее 23:59:59 в качестве конца дня.Это не конец дня, и некоторые типы данных теперь поддерживают точность времени менее секунды.


Если вы действительно не можете использовать ноль в функциях даты, просто используйте базовую дату '1900-01-01 'вместо

SELECT
  DATEADD(YEAR, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), '1900-01-01'))
, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), '1900-01-01')
;

Это также должно работать (здесь работает *1013*):

SELECT
  DATEADD(YEAR, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0))
, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0)
;
0 голосов
/ 09 октября 2018

В предложении WHERE вы можете использовать это условие:

DATEDIFF(month, [YourDateColumn], GETDATE()) BETWEEN 1 AND 36
0 голосов
/ 09 октября 2018

Ваш текущий код выглядит хорошо без каких-либо ошибок, но вы можете использовать вместо него EOMONTH().

Однако, разница будет в типах возврата, которые ваш код будет возвращать время-дата, покаeomonth() вернет только дату.

DECLARE @date DATE
SET @date = getdate()

SELECT EOMONTH(@date, -1)
...