sql server—sql日期间隔每6个月一次

zf2sa74q  于 2021-07-26  发布在  Java
关注(0)|答案(4)|浏览(544)

我的sql server 2014表包括 datetime 调用的列 CreatedOn .
每天我都需要确认在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

数据表
我想要a公司和d公司在我的结果集中

xtupzzrd

xtupzzrd1#

我认为如果你能合并一个新的类似于表格的通信系统,当你的公司需要发送电子邮件时,你可以为他们生成时间表,那就更好了。通过比较该表中的日期,您可以向他们发送邮件。这将是一个更干净的方法,你将能够验证公司何时会收到电子邮件。您可以向该表添加更多的列,以筛选出数据并用于报告目的。

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

您必须根据公司创建日期预填充和管理此表数据。您可以通过将在某个时间间隔触发的存储过程来实现这一点。

zaq34kh6

zaq34kh62#

我将在分离的变量中分离datetime范围,就像这个db<>fiddle示例:
查询:

-- How can I select the first day of a month in SQL?
-- Source: https://stackoverflow.com/a/1520803/12511801

-- 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
voase2hg

voase2hg3#

这是datediff的工作。
试试这样的。

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

看小提琴。
你仍然需要跟踪你发送的信息,以避免错误地向你的客户发送垃圾邮件。

e3bfsja2

e3bfsja24#

这段代码看起来像是在做你要找的事情。

drop table if exists #sample;
go
create table #sample(
  [Name]        varchar(9),
  CreatedOn     datetime);

insert into #sample([Name], CreatedOn) values
('Company A', '2020-10-27 13:49:15'),
('Company B', '2021-04-27 15:25:09'),
('Company C', '2021-03-16 15:50:01'),
('Company D', '2018-04-27 21:58:18');

select *
from #sample
     cross apply (values (datediff(month, CreatedOn, getdate()))) dt(diff)
where day(CreatedOn)=day(getdate())
      and dt.diff%6=0
      and dt.diff/6>=1;
Name        CreatedOn               diff    dy_co
Company A   2020-10-27 13:49:15.000 6       27
Company D   2018-04-27 21:58:18.000 36      27

where子句的作用是:
确保上一个月的前一天与当前的月数相同,在本例中为27。
确保以月为单位的日期差平均除以6
确保以月为单位的日期差至少为6个月

相关问题