/// <summary> /// Routines for testing date/time offset processing. /// </summary> /// <param name="offsetType">enRandomOffsetType enum that determines type of offset to generate (seconds, minutes, hours, days or years).</param> /// <param name="numRows">Number of random offsets to generate.</param> /// <param name="minimumOffset">Minimum offset number. </param> /// <param name="maximumOffset">Maximum offset number.</param> /// <param name="generateRandomTime">Set to true to generate a time for the random offset.</param> /// <param name="fromTime">Minium time to generate.</param> /// <param name="toTime">Maximum time to generate.</param> /// <param name="dateConversionType">Determines whether or not to convert the DateTime value to an integer. Useful for data warehousing scenarios.</param> /// <returns>ADO.NET DataTable containing the set of random values. First column contains a date/time that has been offset from the base value stored in the second column (this is a stand-in for the a value that might be found in a database table or an application. </returns> public DataTable CreateOffsetPreviewDataTable(enRandomOffsetType offsetType, int numRows, string minimumOffset, string maximumOffset, bool generateRandomTime, string fromTime, string toTime, enDateConversionType dateConversionType) { DataTable dt = new DataTable(); DateTime currDate = DateTime.Now; DateTime minDate = DateTime.MinValue; DateTime maxDate = DateTime.MaxValue; try { DataColumn dc = new DataColumn("RandomValue"); //dc.DataType = Type.GetType("System.DateTime"); switch (dateConversionType) { case enDateConversionType.DoNotConvert: dc.DataType = Type.GetType("System.DateTime"); break; case enDateConversionType.ConvertDateTo32bitInt: dc.DataType = Type.GetType("System.Int32"); break; case enDateConversionType.ConvertTimeTo32bitInt: dc.DataType = Type.GetType("System.Int32"); break; case enDateConversionType.ConvertDateTimeTo64bitInt: dc.DataType = Type.GetType("System.Int64"); break; default: dc.DataType = Type.GetType("System.DateTime"); break; } dt.Columns.Add(dc); DataColumn dc2 = new DataColumn("CurrentDate"); dc2.DataType = Type.GetType("System.DateTime"); dt.Columns.Add(dc2); //DataColumn dc3 = new DataColumn("RandomNum"); //dc3.DataType = Type.GetType("System.Int32"); //dt.Columns.Add(dc3); //DataColumn dc4 = new DataColumn("MinDays"); //dc4.DataType = Type.GetType("System.Int32"); //dt.Columns.Add(dc4); //DataColumn dc5 = new DataColumn("MaxDays"); //dc5.DataType = Type.GetType("System.Int32"); //dt.Columns.Add(dc5); //DataColumn dc6 = new DataColumn("nRowNum"); //dc6.DataType = Type.GetType("System.Int32"); //dt.Columns.Add(dc6); for (int i = 0; i < numRows; i++) { double minOffset = Convert.ToDouble(minimumOffset); double maxOffset = Convert.ToDouble(maximumOffset); currDate = _rv.GenerateRandomDate(Convert.ToDateTime("01/01/1900"), Convert.ToDateTime("12/31/2029")); minDate = DateTime.MinValue; maxDate = DateTime.MaxValue; if (offsetType == enRandomOffsetType.enYears) { minDate = currDate.AddYears((int)minOffset); maxDate = currDate.AddYears((int)maxOffset); } else if (offsetType == enRandomOffsetType.enMonths) { minDate = currDate.AddMonths((int)minOffset); maxDate = currDate.AddMonths((int)maxOffset); } else if (offsetType == enRandomOffsetType.enDays) { minDate = currDate.AddDays((int)minOffset); maxDate = currDate.AddDays((int)maxOffset); } else { _msg.Length = 0; _msg.Append("Unable to process offset type passed to CreateOffsetFromDataTableDate routine."); throw new System.Exception(_msg.ToString()); } TimeSpan fromTimeTs = generateRandomTime ? Convert.ToDateTime(fromTime).TimeOfDay : Convert.ToDateTime("01/01/2000 00:00:00").TimeOfDay; TimeSpan toTimeTs = generateRandomTime ? Convert.ToDateTime(toTime).TimeOfDay : Convert.ToDateTime("01/01/2000 23:59:59").TimeOfDay; double fromSeconds = fromTimeTs.TotalSeconds; double toSeconds = toTimeTs.TotalSeconds; DataRow dr = dt.NewRow(); int minDays = (int)minDate.Subtract(DateTime.MinValue).TotalDays; int maxDays = (int)maxDate.Subtract(DateTime.MinValue).TotalDays; int randNum = _rn.GenerateRandomInt(minDays, maxDays); randNum = _rn.GenerateRandomInt(minDays, maxDays); //Second random number is a workaround that fixes problem of random numbers //sequencing from low to high based on earliest to latest dates. //(Jan. 2015: Do not know what is causing sequencing to occur.) //(Guess: might be related to GenerateRandomDate above.) //int randNum = _rn.GenerateRandomInt(689948, 697252); //test int saveRandNum = randNum; TimeSpan ts = new TimeSpan(randNum, 0, 0, 0, 0); DateTime dtm = DateTime.MinValue.Add(ts); if (generateRandomTime) { randNum = _rn.GenerateRandomInt((int)fromSeconds, (int)toSeconds); TimeSpan ts2 = new TimeSpan(0, 0, 0, randNum, 0); dtm = dtm.AddSeconds(ts2.TotalSeconds); } //dr[0] = dtm; switch (dateConversionType) { case enDateConversionType.DoNotConvert: dr[0] = dtm; break; case enDateConversionType.ConvertDateTo32bitInt: dr[0] = Convert.ToInt32(dtm.ToString("yyyyMMdd")); break; case enDateConversionType.ConvertTimeTo32bitInt: dr[0] = Convert.ToInt32(dtm.ToString("HHmmss")); break; case enDateConversionType.ConvertDateTimeTo64bitInt: dr[0] = Convert.ToInt64(dtm.ToString("yyyyMMddHHmmss")); break; default: dr[0] = dtm; break; } dr[1] = currDate; //dr[2] = saveRandNum; //dr[3] = minDays; //dr[4] = maxDays; //dr[5] = i; dt.Rows.Add(dr); } } catch (System.Exception ex) { _msg.Length = 0; _msg.Append("Error in CreateOffsetFromDataTableDate routine.\r\n"); _msg.Append(AppGlobals.AppMessages.FormatErrorMessage(ex)); throw new System.Exception(_msg.ToString()); } finally { ; } return(dt); }