GETDATE в прошлом месяце

$0 не отвечает на вопрос (насколько я понимаю). Демонстрация:

$ cat script.sh
#! /bin/sh
echo `basename $0`
$ ./script.sh 
script.sh
$ ln script.sh linktoscript
$ ./linktoscript 
linktoscript

Как каждый добирается ./linktoscript распечатать script.sh?

[РЕДАКТИРОВАНИЕ] На @ephemient в комментариях выше, хотя вещь символьной ссылки может казаться изобретенной, возможно играть с $0 таким образом, что это не представляет ресурс файловой системы. OP немного неоднозначен о том, что он хотел.

6
задан Imran Ali Khan 18 February 2015 в 12:04
поделиться

7 ответов

Следующее покажет вам начало последний месяц:

-- 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, я часто ссылаюсь на SQL Server Робин Пейдж ДАТА / ВРЕМЯ Верстак . Инструментальные средства (учебник) хорошо спланированы и содержат практически все, что мне когда-либо требовалось при работе с датами на SQL Server.

11
ответ дан 8 December 2019 в 02:19
поделиться

С датами всегда приятно работать на любом языке программирования, не исключая 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

Чтобы развернуть лучшие средства для получения записей в течение определенного периода времени используется функция dateiff, функция dateadd и условие между в предложении 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

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

15
ответ дан 8 December 2019 в 02:19
поделиться

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

2
ответ дан 8 December 2019 в 02:19
поделиться

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

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

Имейте в виду, что эти даты основаны на 00: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;
4
ответ дан 8 December 2019 в 02:19
поделиться
where year(S.DATEENTERED) = year(dateadd(mm, -1, getdate())) and month(S.DATEENTERED) = month(dateadd(mm, -1, getdate()))

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

1
ответ дан 8 December 2019 в 02:19
поделиться

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

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
ответ дан 8 December 2019 в 02:19
поделиться

Попробуйте:

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

...

where datepart(mm,s.dateentered) = @lastm
0
ответ дан 8 December 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: