选择最小日期值并计算日期值?

时间:2020-02-14 07:35:05

标签: c# sql asp.net sql-server

我有一个名为“ SUMMARYDATA” 的表,该表的列为“ STATUSIN,STATUSOUT,LATECOME” ,我想在“ STATUSIN”列上选择最小值。并创建一个条件:IF MIN(STATUSIN) > "08.00 AM" Then LATECOME = MIN(STATUSIN) - "08.00 AM"。如何选择最小日期值?以及如何计算MIN(STATUSIN) - "08.00 AM"

这是我的代码,用于显示数据库中的数据:

    <asp:Repeater ID="rptrSUMMARYDATA" runat="server">
        <HeaderTemplate>
            <table class="table">
                <thead>
                    <tr>
                        <th>IN</th>
                        <th>OUT</th>
                        <th>LATECOME</th>
                    </tr>
                </thead>
                <tbody>
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
                <td><%# Eval("STATUSIN") %></td>
                <td><%# Eval("STATUSOUT") %></td>
                <td><%# Eval("LATECOME") %></td>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
                </tbody>
            </table>
        </FooterTemplate>
    </asp:Repeater>  

这是我在后端的代码:

     private void BindSUMMARYDATARptr()
    {
        String CS = ConfigurationManager.ConnectionStrings["MANHOURConnectionString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(CS))
        {
            using (SqlCommand cmd = new SqlCommand("SELECT * FROM SUMMARYDATA", con))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
                {
                    DataTable dtDaily = new DataTable();
                    sda.Fill(dtDaily);

                    rptrSUMMARYDATA.DataSource = dtDaily;
                    rptrSUMMARYDATA.DataBind();
                }

            }

        }
    }

Sample Data

4 个答案:

答案 0 :(得分:2)

你能试试这个吗?

  SELECT  STATUSIN,STATUSOUT, CASE WHEN CAST(STATUSIN AS TIME) > CAST('08:00:00' AS TIME) 
           THEN CONVERT(varchar, dateadd(s, -28800 ,STATUSIN), 108)  END AS LATECOME 
  FROM SUMMARYDATA

答案 1 :(得分:1)

MIN获取datatable,然后使用DateTime.Subtract

var minIN = Convert.ToDateTime(dt.AsEnumerable().Min(row => row["IN"]));
Console.WriteLine($"LATECOME {minIN.Subtract(minIN.Date + new TimeSpan(8, 0, 0))}");

注意:AsEnumerableSystem.Data.DataSetExtensions的一部分。从nuget安装此软件包

直接在数据库中更新(除非绝对必要,否则我不建议这样做)

UPDATE SUMMARYDATA 
  SET LATECOME =  CASE WHEN DATEDIFF(s,DATEADD(HOUR, 8, CAST(CAST((select MIN(STATUSIN) from SUMMARYDATA)  AS DATE) AS DATETIME)),(select MIN(STATUSIN) from SUMMARYDATA)) > 0 THEN
  (CONVERT(TIME,(select MIN(STATUSIN) from SUMMARYDATA)-DATEADD(HOUR, 8, CAST(CAST((select MIN(STATUSIN) from SUMMARYDATA)  AS DATE) AS DATETIME)))) ELSE NULL END

答案 2 :(得分:1)

select DATEADD(minute, -iif(CAST(STATUSIN as time) > CAST('08:00' as time), DATEDIFF(MINUTE,CAST('08:00' as time),CAST(STATUSIN as time)) ,0) , STATUSIN) as LATECOME
from SUMMARYDATA

答案 3 :(得分:0)

尝试一下:

libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value