2010-01-13 10 views
25

Tworzę raport w usługach raportowania MS SQL Server i trzeba ustawić domyślne parametry raportu Początek i Data zakończenia jako pierwsze i ostatnie daty poprzedniego miesiąca kalendarzowego i potrzebują pomocy.Znajdź pierwszy i ostatni dzień poprzedniego miesiąca kalendarzowego w usługach raportowania programu SQL Server (VB.Net)

Raport generowany jest na 2. dniu kalendarzowym miesiąca i muszę wartości:

Poprzedni miesiąc kalendarzowy
- pierwszy dzień
- ostatni dzień

mam pracowałem z DateAdd, ale nie udało się utworzyć wyrażenia (w VB.NET, jak rozumiem). Naprawdę doceniam każdą pomoc, jaką możesz mi dać!

Odpowiedz

3

w C#:

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

można po prostu zmienić 'nowy 'to' New' i nazwij go 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 do przechowywania "daty odniesienia" w zmiennej, co eliminuje (całkiem mało prawdopodobny, ale możliwy) warunek, w którym występuje miesięczna zmiana między obliczaniem pierwszego i ostatni dzień. –

+0

Nie widziałem tego w produkcji, ale widziałem uszkodzoną zaplanowaną kompilację właśnie z tego powodu. :) –

3

nie jestem zaznajomiony z SSRS, ale można dostać się na początek i koniec poprzedniego miesiąca w Vb.NET przy użyciu konstruktora DateTime, tak:

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

(yourDateDateTime może być dowolny obiekt, taki jak DateTime.Today lub #12/23/2003#)

2

Miałem trudności z tłumaczeniem rzeczywistego VB.NET na podzbiór Wyrażeń, którego używa SSRS. Zdecydowanie mnie zainspirowałeś i właśnie to wymyśliłem.

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

Wiem, że jest nieco rekursywny dla StartDate (pierwszy dzień ostatniego miesiąca). Czy jest tu coś, czego mi tu brakuje? Są to pola ściśle datowe (tzn. Brak czasu), ale myślę, że powinno to uchwycić rok przestępny itp.

Jak to zrobiłem?

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, oto wyrażenia VB znalazłem pracę w SSRS, aby uzyskać pierwsze i ostatnie dni każdego miesiąca, przy użyciu bieżącego miesiąca jako punkt odniesienia:

Pierwszy dzień ostatniego miesiąca:

=dateadd("m",-1,dateserial(year(Today),month(Today),1)) 

Pierwszy dzień tego miesiąca:

=dateadd("m",0,dateserial(year(Today),month(Today),1)) 

Pierwszego dnia następnego miesiąca:

=dateadd("m",1,dateserial(year(Today),month(Today),1)) 

ostatniego dnia ostatniego miesiąca:

=dateadd("m",0,dateserial(year(Today),month(Today),0)) 

Ostatni dzień tego miesiąca:

=dateadd("m",1,dateserial(year(Today),month(Today),0)) 

ostatniego dnia następnego miesiąca:

=dateadd("m",2,dateserial(year(Today),month(Today),0)) 

MSDN documentation for the VisualBasic DateSerial(year,month,day) function wyjaśnia, że funkcja przyjmuje wartości poza spodziewanym zakresem dla parametrów year, , , ,Umożliwia to określenie użytecznych wartości zależnych od daty. Na przykład wartość 0 dla Day oznacza "ostatni dzień poprzedniego miesiąca". Ma to sens: to dzień przed 1 dniem bieżącego miesiąca.

+5

Ostatni dzień miesiąca i ostatni dzień następnego miesiąca są niepoprawne; obaj zakładają, że miesiące, które mają nadejść, mają tę samą liczbę dni co poprzedni miesiąc. Zobacz odpowiedź @Stephanie Grice na lepszy sposób, aby to zrobić w wyrażeniu SSRS. – stubaker

2

Szukałem prostej odpowiedzi, aby rozwiązać to samodzielnie. Oto co znalazłem:

Spowoduje to podzielenie roku i miesiąca, odejmij miesiąc i otrzymaj pierwszy dzień.

firstDayInPreviousMonth = DateSerial(Year(dtmDate), Month(dtmDate) - 1, 1) 

Pobiera pierwszy dzień poprzedniego miesiąca od obecnych

lastDayInPreviousMonth = DateSerial(Year(dtmDate), Month(dtmDate), 0) 

Więcej szczegółów można znaleźć na stronie: http://msdn.microsoft.com/en-us/library/aa227522%28v=vs.60%29.aspx

29

Funkcje te są bardzo pomocne dla mnie - zwłaszcza w ustalaniu raporty dotyczące subskrypcji; Zauważyłem jednak, że podczas korzystania z funkcji Last Day of Current Month zamieszczonej powyżej, działa ona tak długo, jak miesiąc rozpoczęcia ma tę samą liczbę dni co w bieżącym miesiącu.Ja pracowałem przez i przetestowane te modyfikacje i nadzieję, że pomoże innych deweloperów w przyszłość:

Data wzorów: Znajdź pierwszego dnia poprzedniego miesiąca:

DateAdd("m", -1, DateSerial(Year(Today()), Month(Today()), 1)) 

Znajdź Ostatni dzień poprzedniego miesiąca:

DateSerial(Year(Today()), Month(Today()), 0) 

Znajdź Pierwszy dzień bieżącego miesiąca:

DateSerial(Year(Today()),Month(Today()),1) 

Znajdź ostatniego dnia bieżącego miesiąca:

DateSerial(Year(Today()),Month(DateAdd("m", 1, Today())),0) 
0

Ten da Ci tej pory nie ma czasu:

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

Ten daje DateTime:

=dateadd("m",-1,dateserial(year(Today),month(Today),1))