Найти первый и последний день для предыдущего календарного месяца в службах отчетов SQL Server (VB.Net)
Я создаю отчет в службах отчетов MS SQL Server, и мне нужно установить параметры отчета о начальной и конечной дате по умолчанию на первую и последнюю даты предыдущего календарного месяца, и мне нужна помощь.
Отчет создается во второй календарный день месяца, и мне нужны значения для:
Предыдущий календарный месяц
- первый день
- последний день
Я работал с DateAdd, но не смог создать Expression (в VB.NET, насколько я понимаю). Буду очень признателен за любую помощь, которую вы можете мне оказать!
Ответы
Ответ 1
Randall, вот выражения VB, которые я нашел для работы в SSRS, чтобы получить первый и последний дни любого месяца, используя текущий месяц в качестве ссылки:
Первый день за последний месяц:
=dateadd("m",-1,dateserial(year(Today),month(Today),1))
Первый день этого месяца:
=dateadd("m",0,dateserial(year(Today),month(Today),1))
Первый день следующего месяца:
=dateadd("m",1,dateserial(year(Today),month(Today),1))
Последний день последнего месяца:
=dateadd("m",0,dateserial(year(Today),month(Today),0))
Последний день этого месяца:
=dateadd("m",1,dateserial(year(Today),month(Today),0))
Последний день следующего месяца:
=dateadd("m",2,dateserial(year(Today),month(Today),0))
Документация MSDN для функции VisualBasic DateSerial(year,month,day)
объясняет, что функция принимает значения за пределами ожидаемого диапазона для year
, month
и day
параметров. Это позволяет указать полезные относительные значения даты. Например, значение 0 для day
означает "последний день предыдущего месяца". Это имеет смысл: за день до первого дня текущего месяца.
Ответ 2
Эти функции были очень полезны для меня - особенно при настройке отчетов по подписке; однако я заметил, что при использовании функции "Последний день текущего месяца", опубликованной выше, она работает до тех пор, пока в текущем месяце будет столько же дней, сколько и в текущем месяце. Я проработал и протестировал эти модификации и надеюсь, что они помогут другим разработчикам в будущем:
Формулы даты:
Найти первый день предыдущего месяца:
DateAdd("m", -1, DateSerial(Year(Today()), Month(Today()), 1))
Найти последний день предыдущего месяца:
DateSerial(Year(Today()), Month(Today()), 0)
Найти первый день текущего месяца:
DateSerial(Year(Today()),Month(Today()),1)
Найти последний день текущего месяца:
DateSerial(Year(Today()),Month(DateAdd("m", 1, Today())),0)
Ответ 3
Dim thisMonth As New DateTime(DateTime.Today.Year, DateTime.Today.Month, 1)
Dim firstDayLastMonth As DateTime
Dim lastDayLastMonth As DateTime
firstDayLastMonth = thisMonth.AddMonths(-1)
lastDayLastMonth = thisMonth.AddDays(-1)
Ответ 4
Я не знаком с SSRS, но вы можете получить начало и конец предыдущего месяца в VB.Net с помощью конструктора DateTime
, например:
Dim prevMonth As DateTime = yourDate.AddMonths(-1)
Dim prevMonthStart As New DateTime(prevMonth.Year, prevMonth.Month, 1)
Dim prevMonthEnd As New DateTime(prevMonth.Year, prevMonth.Month, DateTime.DaysInMonth(prevMonth.Year, prevMonth.Month))
(yourDate
может быть любым объектом DateTime
, таким как DateTime.Today
или #12/23/2003#
)
Ответ 5
в С#:
new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-1)
new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddDays(-1)
Ответ 6
У меня возникли трудности с переводом фактического VB.NET в подмножество Expression, которое использует SSRS. Вы определенно вдохновили меня, и это то, что я придумал.
StartDate
=dateadd("d",0,dateserial(year(dateadd("d",-1,dateserial(year(Today),month(Today),1))),month(dateadd("d",-1,dateserial(year(Today),month(Today),1))),1))
End Date
=dateadd("d",0,dateserial(year(Today),month(Today),1))
Я знаю это немного рекурсивно для StartDate (первый день последнего месяца). Здесь что-то не хватает? Это строго поля даты (т.е. Нет времени), но я думаю, что это должно зафиксировать високосный год и т.д.
Как я сделал?
Ответ 7
Я искал простой ответ, чтобы решить это сам. вот что я нашел
Это позволит разделить год и месяц, отнять один месяц и получить первый день.
firstDayInPreviousMonth = DateSerial(Year(dtmDate), Month(dtmDate) - 1, 1)
Получает первый день предыдущего месяца из текущего
lastDayInPreviousMonth = DateSerial(Year(dtmDate), Month(dtmDate), 0)
Более подробную информацию можно найти по адресу:
http://msdn.microsoft.com/en-us/library/aa227522%28v=vs.60%29.aspx
Ответ 8
Это даст вам дату без времени:
=FormatDateTime(DateAdd("m", -1, DateSerial(Year(Today()), Month(Today()), 1)),
DateFormat.ShortDate)
Это даст вам дату и время:
=dateadd("m",-1,dateserial(year(Today),month(Today),1))
Ответ 9
Dim aDate As DateTime = #3/1/2008# 'sample date
Dim StartDate As DateTime = aDate.AddMonths(-1).AddDays(-(aDate.Day - 1))
Dim EndDate As DateTime = StartDate.AddDays(DateTime.DaysInMonth(StartDate.Year, StartDate.Month) - 1)
'to access just the date portion
' StartDate.Date
' EndDate.Date