Avatar billede Slettet bruger
27. januar 2015 - 21:44 Der er 9 kommentarer og
1 løsning

splitte date ranges i flere forskellige date ranges

Hej,

Jeg vil gerne vide hvordan jeg splitter en date range op i flere date ranges på månedsbasis.

fx jeg har mindate = 2013-01-01 og maxdate = 2013-12-31

Så vil jeg gerne have
2013-01-01 til 2013-01-31
2013-02-01 til 2013-02-28

osv osv

Jeg skal hente mindate og maxdate fra en sql tabel. Jeg har en ide om hvordan men jeg kan ikke rigtig få det til at virke. Jeg vil gerne i slutningen kunne skrive det til en variable.

Hilfe bitte!
Avatar billede arne_v Ekspert
27. januar 2015 - 22:26 #1
Et bud:


using System;
using System.Collections.Generic;
using System.Linq;

namespace E
{
    public struct DateRange
    {
        public DateTime First;
        public DateTime Last;
        public override string ToString()
        {
            return string.Format("[{0} - {1}]", First.ToShortDateString(), Last.ToShortDateString());
        }

    }
    public static class DateRangeUtil
    {
        public static List<DateTime> Expand(DateRange range)
        {
            List<DateTime> res = new List<DateTime>();
            for(DateTime dt = range.First; dt <= range.Last; dt = dt.AddDays(1)) res.Add(dt);
            return res;
        }
        public static DateRange Collapse(List<DateTime> list)
        {
            return new DateRange { First = list[0], Last = list[list.Count - 1] };
        }
        public static List<DateRange> Group(DateRange range, Func<DateTime, int> eval)
        {
            return Expand(range).GroupBy(dt => eval(dt)).Select(g => new DateRange { First = g.Min(), Last = g.Max() }).ToList();
        }
        public static List<DateRange> GroupByYear(DateRange range)
        {
            return Group(range, dt => dt.Year);
        }
        public static List<DateRange> GroupByMonth(DateRange range)
        {
            return Group(range, dt => 12 * dt.Year + dt.Month);
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            DateRange all = new DateRange { First = new DateTime(2013, 1, 1), Last = new DateTime(2013,12,31) };
            Console.WriteLine(all);
            foreach(DateRange dr in DateRangeUtil.GroupByMonth(all))
            {
                Console.WriteLine(dr);
            }
            Console.ReadKey();
        }
    }
}
Avatar billede Slettet bruger
27. januar 2015 - 22:38 #2
Hej jeg har det her pt.:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Text;
using System.Threading;
using System.Globalization;
using System.Threading.Tasks;


namespace ConsoleApplication1
{
   
    internal class Program
    {
     
        private static void Main(string[] args)
        {
            String s = "";
            String b ="";
         
            List<DateTime> minDate = new List<DateTime>();
            List<DateTime> maxDate = new List<DateTime>();

            using (SqlConnection connection = new SqlConnection("Server=localhost;Initial Catalog=LegOgSpass;Integrated Security=SSPI;Application Name=SQLNCLI11.1"))
            {
                connection.Open();
                string query = "select mindate,maxdate from dbo.dates";
                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            s = reader.GetDateTime(0).ToShortDateString();
                            b = reader.GetDateTime(1).ToShortDateString();
                          // s.Add(reader.GetDateTime(0));
                            //minDate.Add(reader.GetDateTime(0));
                            //maxDate.Add(reader.GetDateTime(1));

                        }
                     

                    }

                }

            }
            DateTime startdate = Convert.ToDateTime(s);
            DateTime enddate = Convert.ToDateTime(b);
            DateTime parseDate;
            List<DateTime> startings = new List<DateTime>();
            List<DateTime> endings = new List<DateTime>();
            startings.Add(startdate);
            parseDate = startdate.AddMonths(1);
            while (parseDate.Day != 1)
                parseDate = parseDate.AddDays(-1);
            parseDate = parseDate.AddDays(-1);
            endings.Add(parseDate);
            while (parseDate < enddate)
            {
                parseDate = parseDate.AddDays(1);
                startings.Add(parseDate);
                parseDate = parseDate.AddMonths(1);
                parseDate = parseDate.AddDays(-1);
                endings.Add(parseDate);
            }
            endings[endings.Count() - 1] = enddate;
        }
   
    }
}

Men jeg kan ikke rigtige finde ud af at udskrive min listeværdier til en variable??

Jeg skal nemlig bruge værdien i en variable til at føre videre i SSIS.

Så lige pt. er alle værdierne gemt i 2 lister. Men mangler at kan skrive dem ud, ved du hvordan?
Avatar billede Slettet bruger
27. januar 2015 - 22:42 #3
Det du har der virker som sådan, men den tager også den fulde range med? så den laver en ekstra linie fra 2013-01-01 til 2013-31-12.

Og hvordan vil man skrive det ud til 2 variabler?
Avatar billede arne_v Ekspert
27. januar 2015 - 22:44 #4
Proev og fjern:

Console.WriteLine(all);

:-)
Avatar billede arne_v Ekspert
27. januar 2015 - 22:45 #5
DateRangeUtil.GroupByMonth(all) returnerer jo en List<DateRange> med alt.
Avatar billede Slettet bruger
27. januar 2015 - 23:01 #6
men det forstår jeg ikke - skal jeg ikke assigne det til en variable??
Avatar billede arne_v Ekspert
27. januar 2015 - 23:12 #7
List<DateRange> months = DateRangeUtil.GroupByMonth(all);
Avatar billede Slettet bruger
27. januar 2015 - 23:45 #8
Jeg fatter intet af det der.

Hvis du tager udgangspunkt i det eksempel jeg har smidt hvor jeg ender med at have 2 lister startings og endings som indholder 13 værdier hver.

Hvordan får jeg så assignet en liste værdi til en variable?
Avatar billede arne_v Ekspert
28. januar 2015 - 04:25 #9
Du kan altid lave:

List<DateTime> I_hate_OOP_startings = months.Select(dr => dr.First).ToList();
List<DateTime> I_hate_OOP_endings = months.Select(dr => dr.Last).ToList();
Avatar billede Slettet bruger
04. februar 2015 - 15:30 #10
Løsning var:

    public void Main()
        {
            Dts.Variables["User::minlist"].Value = new List<DateTime>();
            Dts.Variables["User::maxlist"].Value = new List<DateTime>();
            List<DateTime> minDateList = (List<DateTime>)Dts.Variables["User::minlist"].Value;
            List<DateTime> maxDateList = (List<DateTime>)Dts.Variables["User::maxlist"].Value;
            String s = "2013-01-01";
            String b = "2014-01-01";



            using (SqlConnection connection = new SqlConnection("Server=localhost;Initial Catalog=LegOgSpass;Integrated Security=SSPI;Application Name=SQLNCLI11.1"))
            {
                connection.Open();
                string query = "select mindate,maxdate from dbo.dates";
                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            s = reader.GetDateTime(0).ToShortDateString();
                            b = reader.GetDateTime(1).ToShortDateString();

                            //minDate.Add(reader.GetDateTime(0));
                            //maxDate.Add(reader.GetDateTime(1));
                        }
                    }
                }
            }



            DateTime startdate = Convert.ToDateTime(s);
            DateTime enddate = Convert.ToDateTime(b);
            DateTime parseDate;

            List<DateTime> startings = new List<DateTime>();
            List<DateTime> endings = new List<DateTime>();


            startings.Add(startdate);
            parseDate = startdate.AddMonths(1);

            while (parseDate.Day != 1)
                parseDate = parseDate.AddDays(-1);
            parseDate = parseDate.AddDays(-1);


            endings.Add(parseDate);
            while (parseDate < enddate)
            {
                parseDate = parseDate.AddDays(1);


                startings.Add(parseDate);
                parseDate = parseDate.AddMonths(1);
                parseDate = parseDate.AddDays(-1);

                endings.Add(parseDate);

            }
            endings[endings.Count() - 1] = enddate;


            DataSet ds = new DataSet();
            var dt = ds.Tables.Add();

            dt.Columns.Add("StartDate", typeof(DateTime));
            dt.Columns.Add("EndDate", typeof(DateTime));

            for (int i = 0; i < startings.Count; i++)
            {
                dt.Rows.Add(startings[i], endings[i]);
            }

            Dts.Variables["DataSetOutput"].Value = ds;

            Dts.TaskResult = (int)ScriptResults.Success;
        }


        #region ScriptResults declaration
        /// <summary>
        /// This enum provides a convenient shorthand within the scope of this class for setting the
        /// result of the script.
        ///
        /// This code was generated automatically.
        /// </summary>
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester