2010-01-13 3 views
25

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

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

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

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

ответ

3

в C#:

new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-1) 
new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddDays(-1) 
+2

Вы можете просто изменить 'новый 'to' New' и называть его VB.NET –

15
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) 
+1

+1 для хранения «контрольной даты» в переменной, что устраняет (весьма маловероятное, но возможное) условие, когда есть месячный сдвиг между вычислением первого и в последний день. –

+0

Я не видел этого в производстве, но я видел разбитую запланированную сборку именно по этой причине. :) –

3

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

2

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

Как мне это сделать?

0
 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 
49

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 documentation for the VisualBasic DateSerial(year,month,day) function объясняет, что функция принимает значения вне ожидаемого диапазона для параметров year, month и day. Это позволяет указать полезные относительные значения даты. Например, значение 0 для Day означает «последний день предыдущего месяца». Это имеет смысл: это за день до первого дня текущего месяца.

+5

Последний день этого месяца и последний день следующего месяца неверны; оба предполагают, что в ближайшие месяцы будет такое же количество дней, как и в предыдущем месяце. См. Ответ @Stephanie Grice для лучшего способа сделать это в выражении SSRS. – stubaker

2

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

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

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

29

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

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

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) 
0

Это один даст вам не датировать нет времени:

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

Это один даст вам DATETIME:

=dateadd("m",-1,dateserial(year(Today),month(Today),1)) 
Смежные вопросы