获取开始日期和结束日期之间的所有记录 [Asp.Net C# Web Forms]

Get all Records between start date and end date [Asp.Net C# Web Forms]

我已经 Table 命名为 Employees_Attendance

{
Attend_ID  | EMPloyee_Name | Employee_Department | From_date  | To_date | Employee_ID

Employee_ID is Forigen_key To Employees Table Employee_ID Primary_Key
}

我正在尝试从 Employees_attendance 获取所有记录取决于 $Start_date 和 $End_date $Start_date 是文本框控件 从日历控件中获取他的文本 {<asp:TextBox ID="TextFrom" runat="server"></asp:TextBox> } $End_date 与 $Start_date

相同

我的问题: 当我按 $Start_date 和 $end_date 搜索时,返回的记录仅匹配 $start_date。

我想要的结果: 我需要根据 Employees_attendance_tbl 中的日期获取特定员工的所有记录 在 $Start_date 之间,如上所述,它是从文本框中获取的 $end_date 也是从文本框中获取的

请看我的存储过程

{
USE [ASPCRUD]
GO
/****** Object:  StoredProcedure [dbo].[DailyReportInfo]    Script Date: 11/23/2020 4:32:05 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[DailyReportInfo]

@Day_From  datetime,
@Day_To datetime
AS
BEGIN
select Emp_Attend.Emp_Name, Emp_Attend.Dep_Name , Emp_Attend.Day_From , Emp_Attend.Day_To  , Emp_Attend.Day_Type
from Emp_Attend 
LEFT JOIN Employees on Emp_Attend.Emp_ID = Employees.EmpID
WHERE
 CONVERT(date,Emp_Attend.Day_From) >= CONVERT(date,@Day_From) AND  CONVERT(date,Emp_Attend.Day_From) <= CONVERT(date,@Day_From) OR
 
 CONVERT(date,Emp_Attend.Day_To) >= CONVERT(date,@Day_To) AND  CONVERT(date,Emp_Attend.Day_To) <= CONVERT(date,@Day_To)
END
}

好的,所以你想要给定 start/end 日期之间的任何出席日期。

这很简单。

根据这个逻辑发生碰撞:

RequestStartDate <= EndDate 
and 
RequestEndDate >= StartDate  

以上将找到所有和任何重叠。

因此,如果出勤记录包含开始结束(较早和较晚),则发生匹配。

如果任何请求日期落在该范围内,则会再次匹配。

如果任何请求日期重叠?然后再次匹配上述简单条件。

所以,让我们构建一个表单。

放入标签+文本框。将文本框格式设置为日期。 剪切 + 粘贴(开始 + 结束)

在窗体上拖动网格视图。迄今为止?不到2分钟的时间在这里度过。

所以,我们有这个:


        <asp:Label ID="Label2" runat="server" Text="End Date" Style="margin-left:20px"></asp:Label>
        <asp:TextBox ID="txtRequestEnd" runat="server" Style="margin-left:20px" TextMode="Date"></asp:TextBox>

        <asp:Button ID="btnSearch" runat="server" Text="Search" Style="margin-left:20px"/>
        <br />
        <br />

        <asp:GridView ID="GridView1" runat="server"></asp:GridView>

因此,要用存储过程的结果填充网格,我们可以在按钮后面使用以下代码:

  Using cmdSQL As New SqlCommand("GetBookings",
                                   New SqlConnection(GetConstr()))
        cmdSQL.CommandType = CommandType.StoredProcedure
        cmdSQL.Connection.Open()
        cmdSQL.Parameters.Add("@ReqStart", SqlDbType.Date).Value = txtRequestStart.Text
        cmdSQL.Parameters.Add("@ReqEnd", SqlDbType.Date).Value = txtRequestEnd.Text

        Dim rs As New DataTable
        rs.Load(cmdSQL.ExecuteReader)

        GridView1.DataSource = rs
        GridView1.DataBind()

    End Using

结果是这样的:

我的存储过程是这样的:

ALTER PROCEDURE [dbo].[GetBookings]
    @ReqStart datetime,
    @ReqEnd datetime
AS
BEGIN
    SET NOCOUNT ON;

    SELECT * 
    FROM vBooking 
    WHERE @ReqStart <= ToDate 
      AND @ReqEnd >= FromDate
      AND HotelName IS NOT NULL
END

因此,对于您的情况,只需使用上述简单的碰撞逻辑即可。任何重叠,开始或结束,甚至落在您的请求开始 + 结束范围内的范围都适用于上述内容。