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()))
感谢大家的帮助。
我的 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()))
感谢大家的帮助。