Найти первый и последний день предыдущего календарного месяца в службах отчетов SQL Server (VB.Net) - PullRequest
30 голосов
/ 13 января 2010

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

Отчет генерируется во 2-й календарный день месяца, и мне нужны значения для:

Предыдущий календарный месяц
- первый день
- последний день

Я работал с DateAdd, но не смог создать Expression (в VB.NET, насколько я понимаю). Буду очень признателен за любую помощь!

Ответы [ 9 ]

63 голосов
/ 25 сентября 2012

Рэндалл, вот выражения 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 означает «последний день предыдущего месяца». Это имеет смысл: это день до первого дня текущего месяца.

32 голосов
/ 13 марта 2014

Эти функции были очень полезны для меня - особенно при настройке отчетов по подписке; однако я заметил, что при использовании функции «Последний день текущего месяца», опубликованной выше, она работает до тех пор, пока в текущем месяце будет столько же дней, сколько и в текущем месяце. Я проработал и протестировал эти модификации и надеюсь, что они помогут другим разработчикам в будущем:

Формулы даты: Найти первый день предыдущего месяца:

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)
16 голосов
/ 13 января 2010
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 голосов
/ 13 января 2010

Я не знаком с 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#)

3 голосов
/ 14 января 2010

У меня были некоторые трудности с переводом реального 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 (первый день прошлого месяца). Есть ли что-то, что я здесь скучаю? Это строго поля даты (т.е. без времени), но я думаю, что это должно охватывать високосный год и т. Д.

Как я это сделал?

3 голосов
/ 13 января 2010

в C #:

new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-1)
new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddDays(-1)
2 голосов
/ 25 сентября 2013

Я искал простой ответ, чтобы решить это сам. вот что я нашел

Это позволит разделить год и месяц, взять один месяц отпуска и получить первый день.

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

1 голос
/ 29 июля 2014

Это даст вам дату без времени:

=FormatDateTime(DateAdd("m", -1, DateSerial(Year(Today()), Month(Today()), 1)), 
DateFormat.ShortDate)

Это даст вам дату и время:

=dateadd("m",-1,dateserial(year(Today),month(Today),1)) 
0 голосов
/ 14 января 2010
        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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...