GETDATE в прошлом месяце - PullRequest
6 голосов
/ 12 июля 2009

Я пытаюсь просмотреть последнюю статистику сайта. Я перечислил последние 30 дней с;

CONVERT(VARCHAR(10), S.DATEENTERED, 101) 
  BETWEEN 
    CONVERT(VARCHAR(10), GETDATE()-30, 101) 
  AND 
    CONVERT(VARCHAR(10), GETDATE(), 101) 

и этот месяц с;

RIGHT(CONVERT(VARCHAR(10), S.DATEENTERED, 103), 7) = 
RIGHT(CONVERT(VARCHAR(10), GETDATE(), 103), 7)

но я не знаю, какой запрос использовать в прошлом месяце. Я пробовал с;

RIGHT(CONVERT(VARCHAR(10), S.DATEENTERED, 103), 7) = 
RIGHT(CONVERT(VARCHAR(10), GETDATE()-1, 103), 7) 

Не работает.

Ответы [ 8 ]

15 голосов
/ 12 июля 2009

С датами всегда приятно работать на любом языке программирования, кроме SQL.

Чтобы ответить на ваш вопрос, найдите все записи, которые произошли в прошлом месяце

select S.DATEENTERED
      ,*
  from sometable S
 where S.DATEENTERED
       between dateadd(mm, datediff(mm, 0, dateadd(MM, -1, getdate())), 0)
           and dateadd(ms, -3, dateadd(mm, datediff(mm, 0, dateadd(MM, -1, getdate())) + 1, 0))
order by 1

Чтобы расширить лучшие средства для получения записей в течение определенного периода времени, используйте функцию datediff, функцию dateadd и условие before в предложении where.

select 'howdy'
      ,getdate()
 where getdate()
       between dateadd(mm, 0, 0)
           and dateadd(ms, -3, dateadd(mm, datediff(mm, 0, dateadd(mm,-1,getutcdate())) + 1, 0))

Приведенный выше код не приведет к возвращению записей, поскольку он проверяет, находится ли сегодняшняя дата между 1900-01-01 00: 00: 00.000 и последней возможной записанной датой прошлого месяца (последний день и 23:59 : 59.997 - Столбцы DATETIME в SQL Server имеют разрешение не более 3 миллисекунд).

Следующий код вернет запись, так как дата, которую мы ищем, была месяц назад.

select 'howdy'
      ,dateadd(mm, -1, getdate())
 where dateadd(mm, -1, getdate())
       between dateadd(mm, 0, 0)
           and dateadd(ms, -3, dateadd(mm, datediff(mm, 0, dateadd(mm,-1,getutcdate())) + 1, 0))

Разбиение предложения where:

WHERE getdate()  -- date to check
between dateadd(mm, 0, 0) -- begin date
and dateadd(ms, -3, dateadd(mm, datediff(mm, 0, dateadd(mm,-1,getutcdate())) + 1, 0)) -- end date

Наконец, таким образом можно установить различные даты, вот довольно полный список:

select dateadd(mm, 0, 0) as BeginningOfTime
      ,dateadd(dd, datediff(dd, 0, getdate()), 0) as Today
      ,dateadd(wk, datediff(wk, 0, getdate()), 0) as ThisWeekStart
      ,dateadd(mm, datediff(mm, 0, getdate()), 0) as ThisMonthStart
      ,dateadd(qq, datediff(qq, 0, getdate()), 0) as ThisQuarterStart
      ,dateadd(yy, datediff(yy, 0, getdate()), 0) as ThisYearStart
      ,dateadd(dd, datediff(dd, 0, getdate()) + 1, 0) as Tomorrow
      ,dateadd(wk, datediff(wk, 0, getdate()) + 1, 0) as NextWeekStart
      ,dateadd(mm, datediff(mm, 0, getdate()) + 1, 0) as NextMonthStart
      ,dateadd(qq, datediff(qq, 0, getdate()) + 1, 0) as NextQuarterStart
      ,dateadd(yy, datediff(yy, 0, getdate()) + 1, 0) as NextYearStart
      ,dateadd(ms, -3, dateadd(dd, datediff(dd, 0, getdate()) + 1, 0)) as TodayEnd
      ,dateadd(ms, -3, dateadd(wk, datediff(wk, 0, getdate()) + 1, 0)) as ThisWeekEnd
      ,dateadd(ms, -3, dateadd(mm, datediff(mm, 0, getdate()) + 1, 0)) as ThisMonthEnd
      ,dateadd(ms, -3, dateadd(qq, datediff(qq, 0, getdate()) + 1, 0)) as ThisQuarterEnd
      ,dateadd(ms, -3, dateadd(yy, datediff(yy, 0, getdate()) + 1, 0)) as ThisYearEnd

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

11 голосов
/ 12 июля 2009

Следующее найдет вам начало прошлого месяца:

-- Start of last month 
SELECT CAST('01 '+ RIGHT(CONVERT(CHAR(11),DATEADD(MONTH,-1,GETDATE()),113),8) AS datetime)

Затем вы найдете начало этого месяца, используя следующий минус один.

-- Start of the month 
SELECT CAST('01 '+ RIGHT(CONVERT(CHAR(11),GETDATE(),113),8) AS datetime) 

Когда мне приходится работать с датами в SQL Server, я часто обращаюсь к Инструментальные средства Robyn Page SQL Server DATE / TIME . Рабочая среда (учебное пособие) хорошо продумана и содержит практически все, что мне когда-либо требовалось при работе с датами в SQL Server.

6 голосов
/ 28 января 2015

Как насчет этого?

select DATEADD(month, -1, GETDATE())
4 голосов
/ 12 июля 2009

Я бы предложил использовать для операции первый день прошлого месяца и первый день текущего месяца, а не использовать МЕЖДУ используйте> = и <. Это мое личное мнение, но я полагаю, что вы найдете преимущества такого подхода в производительности и удобстве обслуживания. </p>

Вот sql. Вы заметите, что я включил значение последнего дня за последний месяц на тот случай, если вы в конечном итоге выберете другой подход.

Имейте в виду, эти даты основаны на 12:00 в тот день. Другими словами, получение значений между 01.06.2009 и 30.06.2009 не даст вам того, что вы хотите, поскольку все 30.06.2009 исключены. Если вы используете первый день июля (01.07.2009), вы застрахованы.

Опять же, я рекомендую избегать МЕЖДУ все вместе, как показано ниже. Желаем удачи.

Declare @LastMonthFirstDay datetime
Declare @LastMonthLastDay datetime
Declare @ThisMonthFirstDay datetime

Set @LastMonthFirstDay =  DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP) - 1, 0);
Set @ThisMonthFirstDay = DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0);
Set @LastMonthLastDay = DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0));

Select * From Table
Where DateEntered >= @LastMonthFirstDay 
And DateEntered < @ThisMonthFirstDay;
2 голосов
/ 12 июля 2009

Попробуйте использовать функцию DATEADD. Вы можете добавить -1 с датой МЕСЯЦА (мм), и она должна работать. Вот ссылка

1 голос
/ 12 июля 2009
where year(S.DATEENTERED) = year(dateadd(mm, -1, getdate())) and month(S.DATEENTERED) = month(dateadd(mm, -1, getdate()))

Не может быть хорошей производительности, но у вас есть идея.

0 голосов
/ 12 июля 2009

ПОЛУЧИТЕ ПЕРВЫЙ ДЕНЬ ПОСЛЕДНЕГО МЕСЯЦА

SELECT DATEADD(MM, DATEDIFF(MM, '01/01/2000', DATEADD(MM, -1,GETDATE())), '01/01/2000')

ПОЛУЧИТЬ ПОСЛЕДНИЙ ДЕНЬ ПОСЛЕДНЕГО МЕСЯЦА

SELECT DATEADD(SS,-1,DATEADD(MM, DATEDIFF(MM,'01/01/2000',GETDATE()),'01/01/2000')) 

Затем выполните поиск на основе этого диапазона.

0 голосов
/ 12 июля 2009

Попробуйте:

declare @lastm int
set @lastm = datepart(mm,getdate()) - 1

...

where datepart(mm,s.dateentered) = @lastm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...