如何确定sql中前n个月存在的行或记录?

Posted

技术标签:

【中文标题】如何确定sql中前n个月存在的行或记录?【英文标题】:How to determine rows or records that is present in some n previous months in sql? 【发布时间】:2021-01-18 07:39:10 【问题描述】:

我有一个表,其中包含有关用户何时开始和结束特定任务的信息。我有一种情况,我需要查找任务是否在上个月创建并在本月关闭

例如:任务“A”于 2020 年 9 月 1 日创建,同一任务于 2021 年 1 月 17 日关闭。我需要根据选择的日期范围(如“2020 年 9 月 1 日”到“2021 年 1 月 31 日”)查找此记录并显示所有月份的工作小时总和

有一个表来存储所有任务的详细信息。以下是示例数据

Task Name Start Date Time End Date Time Allocated Minutes
Task A 2020-11-30 11:00:00.000 2020-12-01 11:00:00.000 1440
Task B 2020-12-02 11:00:00.000 2020-12-03 11:00:00.000 1440
Task C 2020-31-01 11:00:00.000 2021-01-01 11:00:00.000 1440

请在这方面帮助我。任何帮助将不胜感激。

感谢和问候

【问题讨论】:

请展示一些示例数据、预期结果和尝试查询 您好,请查看此链接encodedna.com/sqlserver/tips/… @RaviKumar 先生,我需要根据选择的日期范围查找在上个月的任何一个创建并在本月关闭的记录 您面临的问题是什么? 【参考方案1】:

你可以在sql-server中使用eomonthdateadd得到你想要的日期范围

select * 
from [tablename]
where startdate between dateadd(day,1,eomonth(dateadd(month,-2,getdate()))) and eomonth(dateadd(month,-1,getdate()))
and enddate between dateadd(day,1,eomonth(dateadd(month,-1,getdate()))) and eomonth(getdate())

这将获取上个月开始日期和本月结束日期的行。

【讨论】:

【参考方案2】:

您可以像这样查找两个日期之间的数据:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2021'
set @endDate = '01/01/2020'

select Task_Name from YOUR_TABLE
where date >= @startDate 
and   date < @endDate

找出两个日期之间的小时数:

select 
    CONVERT(int,DATEDIFF(hh, @endDate , @startDate ) / 60) as Hrs_Difference

【讨论】:

【参考方案3】:

任务是否在上个月创建并在本月关闭

我会使用datefromparts():

where startdatetime < datefromparts(year(getdate()), month(getdate()), 1) and
      startdatetime >= dateadd(month, -1, datefromparts(year(getdate()), month(getdate()), 1) and          
      enddatetime >= datefromparts(year(getdate()), month(getdate()), 1)

这假设您没有未来的结束日期时间,这似乎很合理。

【讨论】:

以上是关于如何确定sql中前n个月存在的行或记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle SQL 中选择上个月登录并在 8 月之前的一个月中记录最少 1 次的行?

sql 示例:如果行存在,则如何更新行或如​​果行不存在则插入行

如果使用命令行或 sql 在大查询中不存在表,如何创建表

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

如何交换二维数组中的行或列?

如何确定Oracle数据库表中重复的记录