【问题标题】:How to cocat a datetime type field and a float type field. After that parse as a datetime datatype field (daypilot calendar)如何连接日期时间类型字段和浮点类型字段。之后解析为日期时间数据类型字段(daypilot 日历)
【发布时间】:2014-04-06 05:57:01
【问题描述】:

我的老师告诉我选择 columndate cocat columntime 作为 column3,然后将 column3 解析为 datetime 数据类型。他说我无法更改数据库数据类型,我需要使用这 4 列字段 start_date、end_date、start_time 和 end_time,因为它在服务器中,所以他告诉我这样做。

他的意思是将 start_date 字段和 start_time 字段合并为代码中的一列,然后将其转换为代码中的 datetime 类型。结束日期字段和 end_time 字段也是如此。这意味着,例如,记录 1 的 start_date 和 start_time 将变为 2014 年 3 月 4 日上午 9:00:00,记录 1 的 end_date 和 end_time 将变为 2014 年 3 月 4 日下午 12:00:00。

所以下面是我的代码,它用于调度程序/时间表,称为 daypilot。那么可以帮助我查询转换吗?在下面的代码中有一个 start_date 和 end_date,将被最终解析的 datetime 数据类型替换。帮助人

我的日程表

我的 DAYPILOT 控制属性

如果代码有效,则为理想的输出......这就是我想要实现的目标。我已经使用表中的两个日期时间列对此进行了测试。

public partial class number2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DayPilotCalendar1.StartDate = DayPilot.Utils.Week.FirstWorkingDayOfWeek(new DateTime(2014, 03, 24));
            DayPilotCalendar1.DataSource = dbGetEvents(DayPilotCalendar1.StartDate, DayPilotCalendar1.Days);
            DataBind();
        }
    }

    private DataTable dbGetEvents(DateTime start, int days)
    {        
        string constr = ConfigurationManager.ConnectionStrings["ProjectConnectionString"].ConnectionString;
        SqlDataAdapter da = new SqlDataAdapter("SELECT ID, PURPOSE, [START_DATE], [END_DATE] FROM [Schedule]  WHERE NOT (([END_DATE] <= @start) OR ([START_DATE] >= @end))", constr);
        da.SelectCommand.Parameters.AddWithValue("start", start);
        da.SelectCommand.Parameters.AddWithValue("end", start.AddDays(days));
        DataTable dt = new DataTable();
        da.Fill(dt);
        return dt;

    }
}

遵循@Trafz 代码,它起作用了。这就是答案。

public partial class number2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DayPilotCalendar1.StartDate = DayPilot.Utils.Week.FirstWorkingDayOfWeek(new DateTime(2014, 04, 03));
            //DayPilotCalendar1.StartDate = DayPilot.Utils.Week.FirstWorkingDayOfWeek(DateTime.Now.AddDays(-(int)DateTime.Now.DayOfWeek).Date);
            DayPilotCalendar1.DataSource = dbGetEvents(DayPilotCalendar1.StartDate, DayPilotCalendar1.Days);
            DataBind();
        }

    }

    private DataTable dbGetEvents(DateTime start, int days)
    {
        string constr = ConfigurationManager.ConnectionStrings["ProjectConnectionString"].ConnectionString;
        SqlDataAdapter da = new SqlDataAdapter("SELECT ID, PURPOSE, [START_DATE], [END_DATE], [START_TIME], [END_TIME] FROM [Schedule]", constr);
        da.SelectCommand.Parameters.AddWithValue("start", start);
        da.SelectCommand.Parameters.AddWithValue("end", start.AddDays(days));
        DataTable dt = new DataTable();
        da.Fill(dt);

        for (int i = 0; i < dt.Rows.Count; i++)
        {
            dt.Rows[i]["START_DATE"] = CombineDateAndTime(dt.Rows[i]["START_DATE"], dt.Rows[i]["START_TIME"]);
            dt.Rows[i]["END_DATE"] = CombineDateAndTime(dt.Rows[i]["END_DATE"], dt.Rows[i]["END_TIME"]);
        }

        return dt;
    }

    public static DateTime CombineDateAndTime(object date, object time)
    {
        if (date == null)
        {
            // Add some logic for this scenario. Here are 2 examples:
            //throw new ArgumentNullException("date");
            //date = DateTime.MaxValue;
        }
        if (time == null)
        {
            // Add some logic for this scenario.
            //throw new ArgumentNullException("time");
            //time = 0;
        }

        DateTime dt = Convert.ToDateTime(date);
        float hoursAndMinutes = Convert.ToInt32(time);

        return CombineDateAndTime(dt, hoursAndMinutes);
    }
    public static DateTime CombineDateAndTime(DateTime date, float time)
    {
        int hours = Convert.ToInt32(Math.Round((decimal)time / 100, MidpointRounding.AwayFromZero));
        float remainder = time - (hours * 100);
        int minutes = Convert.ToInt32(Math.Round((decimal)remainder, MidpointRounding.AwayFromZero));
        DateTime returnDate = date.Date.AddHours(hours).AddMinutes(minutes);
        return returnDate;
    }
}

【问题讨论】:

    标签: c# parsing datetime webforms concatenation


    【解决方案1】:

    执行此操作后:da.Fill(dt);,您可以更改它收到的数据。

    这是我认为您可以如何将 2 列合并为 1 个 DateTime 的 code-sn-p:

    public static void JustSomeMethodToTestTheConvertion()
    {
        DateTime date = DateTime.Now.Date;
        float time = 900;
        DateTime concatDate = CombineDateAndTime(date, time);
        Console.WriteLine(concatDate);
    }
    
    public static DateTime CombineDateAndTime(DateTime date, float time)
    {
        int hours = Convert.ToInt32(Math.Round((decimal)time / 100, MidpointRounding.AwayFromZero));
        float remainder = time - (hours * 100);
        int minutes = Convert.ToInt32(Math.Round((decimal)remainder, MidpointRounding.AwayFromZero));
        return date.AddHours(hours).AddMinutes(minutes);
    }
    

    因此,您需要遍历数据并执行类似的操作,然后将其填写。

    回复您的评论:

    private DataTable dbGetEvents(DateTime start, int days)
    {
        string constr = ConfigurationManager.ConnectionStrings["ProjectConnectionString"].ConnectionString;
        SqlDataAdapter da = new SqlDataAdapter("SELECT ID, PURPOSE, [START_DATE], [END_DATE] FROM [Schedule]  WHERE NOT (([END_DATE] <= @start) OR ([START_DATE] >= @end))", constr);
        da.SelectCommand.Parameters.AddWithValue("start", start);
        da.SelectCommand.Parameters.AddWithValue("end", start.AddDays(days));
        DataTable dt = new DataTable();
        da.Fill(dt);
    
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            dt.Rows[i]["YourConcatDateColumn"] = CombineDateAndTime(dt.Rows[i]["Date"], dt.Rows[i]["Time"]);
        }
    
        return dt;
    }
    
    public static DateTime CombineDateAndTime(object date, object time)
    {
        if (date == null)
        {
            // Add some logic for this scenario. Here are 2 examples:
            //throw new ArgumentNullException("date");
            //date = DateTime.MaxValue;
        }
        if (time == null)
        {
            // Add some logic for this scenario.
            //throw new ArgumentNullException("time");
            //time = 0;
        }
    
        DateTime dt = Convert.ToDateTime(date);
        float hoursAndMinutes = Convert.ToInt32(time);
    
        return CombineDateAndTime(dt, hoursAndMinutes);
    }
    public static DateTime CombineDateAndTime(DateTime date, float time)
    {
        int hours = Convert.ToInt32(Math.Round((decimal)time / 100, MidpointRounding.AwayFromZero));
        float remainder = time - (hours * 100);
        int minutes = Convert.ToInt32(Math.Round((decimal)remainder, MidpointRounding.AwayFromZero));
        DateTime returnDate = date.Date.AddHours(hours).AddMinutes(minutes);
        return returnDate;
    }
    

    但是您需要SELECT 所有需要的列,并将"YourConcatDateColumn" 部分更改为要使用的正确列的名称。例如。 ["START_DATE"]["START_TIME"]

    【讨论】:

    • 我突然发现对于 DayPilotCalendar1.StartDate = DayPilot.Utils.Week.FirstWorkingDayOfWeek(DateTime.Now.AddDays((int)DateTime.Now.DayOfWeek).Date);它将使用本周的前一周。 @Trafz
    • 我找到了。这个更好。 DayPilotCalendar1.StartDate = DayPilot.Utils.Week.FirstWorkingDayOfWeek(DateTime.Today); @Trafz
    • 好吧,如果您阅读我从我这里得到的代码,您会注意到它在(int)DateTime.Now‌ 前面有一个-。这就是为什么它“突然”不再起作用了。我添加这种奇怪逻辑的原因是因为我不知道他们是如何制作Utils.Week.FirstWorkingDayOfWeek() 的。虽然我看到我忘记添加 1 天,但它可能无论如何都无法正常工作。只要你让它工作,那就太好了:)
    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2017-05-09
    • 2019-02-09
    相关资源
    最近更新 更多