$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 немного неоднозначен о том, что он хотел.
Следующее покажет вам начало последний месяц:
-- 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.
С датами всегда приятно работать на любом языке программирования, не исключая 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
Используя приведенный выше список, можно определить диапазон любого типа.
Попробуйте использовать функцию DATEADD. Вы можете добавить -1 с датой МЕСЯЦ (мм), и он должен работать. Вот ссылка
Я бы предложил использовать для операции первый день прошлого месяца и первый день текущего месяца, а не использовать МЕЖДУ> = и <. Это мое личное мнение, но я считаю, что этот подход дает преимущества в производительности и ремонтопригодности.
Вот 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;
where year(S.DATEENTERED) = year(dateadd(mm, -1, getdate())) and month(S.DATEENTERED) = month(dateadd(mm, -1, getdate()))
Может быть, не очень хорошо с точки зрения производительности, но идея у вас есть.
ПОЛУЧИТЬ ПЕРВЫЙ ДЕНЬ ПОСЛЕДНЕГО МЕСЯЦА
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'))
Затем выполните поиск на основе этого диапазона.
Попробуйте:
declare @lastm int
set @lastm = datepart(mm,getdate()) - 1
...
where datepart(mm,s.dateentered) = @lastm