获取开始日期和结束日期之间的所有记录 [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
因此,对于您的情况,只需使用上述简单的碰撞逻辑即可。任何重叠,开始或结束,甚至落在您的请求开始 + 结束范围内的范围都适用于上述内容。
我已经 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
因此,对于您的情况,只需使用上述简单的碰撞逻辑即可。任何重叠,开始或结束,甚至落在您的请求开始 + 结束范围内的范围都适用于上述内容。