SQL 每 6 个月的日期间隔

SQL date interval every 6 months

我的 SQL Server 2014 table 包括一个名为 CreatedOn.

datetime

我每天都需要确定恰好在 6 个月前或 6 个月前的倍数(即存储日期时间后 6 个月、12 个月后、18 个月后等)的该日期创建的公司。我可以编写查询的其余部分,但无法弄清楚如何识别与日期列表匹配的行(即 2020 年 10 月 27 日、2020 年 4 月 27 日、2019 年 10 月 27 日、2019 年 4 月 27 日、2018 年 10 月 27 日、2018 年 4 月 27 日、等)。

这里是获取恰好 6 个月前创建的公司的查询。我如何调整查询以包括额外的 6 个月间隔?

select * 
from work 
where DATEPART(d, CreatedOn) = DATEPART(d, DATEADD(m, -6, getdate()))
  and DATEPART(m, CreatedOn) = DATEPART(m, DATEADD(m, -6, getdate()))
  and DATEPART(yyyy, CreatedOn) = DATEPART(yyyy, DATEADD(m, -6, getdate()))

示例数据

Name          CreatedOn
-------------------------------------
Company A     2020-10-27 13:49:15.597
Company B     2021-04-27 15:25:09.720
Company C     2021-03-16 15:50:01.443
Company D     2018-04-27 21:58:18.903

Data Table

我希望公司 A 和公司 D 出现在我的结果集中

我认为如果您可以合并一个新的 table 会更好,例如 Communication,您可以在公司需要发送电子邮件时为他们生成时间表。通过比较 table 的日期,您可以向他们发送邮件。这将是一种更简洁的方法,您将能够验证公司何时真正收到电子邮件。您可以向 table IsEmailSend 添加更多列以过滤数据并用于报告目的。

CompanyId | EmailSchedule | IsEmailSend
1 | 2020-10-27 | 1
1 | 2021-04-27 | 0
...

您必须根据公司创建日期预填充和管理此 table 数据。您可以通过一些将在某个时间间隔触发的存储过程来执行此操作。

我会将日期时间范围分隔在单独的变量中,就像这样 db<>fiddle sample:

查询:

-- How can I select the first day of a month in SQL?
-- Source: 

-- First day of the date (6 months back): 
DECLARE @date_start_range DATE = CAST(DATEADD(month, DATEDIFF(month, 0, DATEADD(MONTH, -6, GETDATE())), 0) AS DATE);

-- First day of the current month: 
DECLARE @date_end_range DATE = CAST(DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) AS DATE);

-- Query results where CreatedOn is between current date and 6 months back: 
SELECT W.* 
FROM work AS W
WHERE CAST(W.CreatedOn AS DATE) BETWEEN @date_start_range AND @date_end_range;
GO

结果:

Name      | CreatedOn              
:-------- | :----------------------
Company A | 2020-10-27 13:49:15.597
Company C | 2021-03-16 15:50:01.443

这是 DATEDIFF 的工作。

尝试这样的事情。

WITH Dates AS (
SELECT DATEDIFF(month, CreatedOn, GETDATE()) monthsago,
       Name
  FROM sample 
)
SELECT * 
  FROM Dates
 WHERE monthsago % 6 = 0
   AND monthsago > 0

参见fiddle

您仍然需要跟踪您发送的消息,以避免错误地向您的客户发送垃圾邮件。

我想多了。我真的不在乎年份,每月的日期始终是当天(运行 午夜之前),我只需要获取当前月份和 6 个月前的月份。

select * 从工作中 其中 DATEPART(d, CreatedOn) = DATEPART(d, getdate()) AND (DATEPART(m, CreatedOn) = DATEPART(m, DATEADD(m, -6, getdate())) 或 DATEPART(m, CreatedOn) = DATEPART(m, getdate()))

感谢大家的帮助。