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

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

我的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个月间隔?

  1. select *
  2. from work
  3. where DATEPART(d, CreatedOn) = DATEPART(d, DATEADD(m, -6, getdate()))
  4. and DATEPART(m, CreatedOn) = DATEPART(m, DATEADD(m, -6, getdate()))
  5. and DATEPART(yyyy, CreatedOn) = DATEPART(yyyy, DATEADD(m, -6, getdate()))

样本数据

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

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

xtupzzrd

xtupzzrd1#

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

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

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

zaq34kh6

zaq34kh62#

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

  1. -- How can I select the first day of a month in SQL?
  2. -- Source: https://stackoverflow.com/a/1520803/12511801
  3. -- First day of the date (6 months back):
  4. DECLARE @date_start_range DATE = CAST(DATEADD(month, DATEDIFF(month, 0, DATEADD(MONTH, -6, GETDATE())), 0) AS DATE);
  5. -- First day of the current month:
  6. DECLARE @date_end_range DATE = CAST(DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) AS DATE);
  7. -- Query results where CreatedOn is between current date and 6 months back:
  8. SELECT W.*
  9. FROM work AS W
  10. WHERE CAST(W.CreatedOn AS DATE) BETWEEN @date_start_range AND @date_end_range;
  11. GO

结果:

  1. Name | CreatedOn
  2. :-------- | :----------------------
  3. Company A | 2020-10-27 13:49:15.597
  4. Company C | 2021-03-16 15:50:01.443
展开查看全部
voase2hg

voase2hg3#

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

  1. WITH Dates AS (
  2. SELECT DATEDIFF(month, CreatedOn, GETDATE()) monthsago,
  3. Name
  4. FROM sample
  5. )
  6. SELECT *
  7. FROM Dates
  8. WHERE monthsago % 6 = 0
  9. AND monthsago > 0

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

e3bfsja2

e3bfsja24#

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

  1. drop table if exists #sample;
  2. go
  3. create table #sample(
  4. [Name] varchar(9),
  5. CreatedOn datetime);
  6. insert into #sample([Name], CreatedOn) values
  7. ('Company A', '2020-10-27 13:49:15'),
  8. ('Company B', '2021-04-27 15:25:09'),
  9. ('Company C', '2021-03-16 15:50:01'),
  10. ('Company D', '2018-04-27 21:58:18');
  11. select *
  12. from #sample
  13. cross apply (values (datediff(month, CreatedOn, getdate()))) dt(diff)
  14. where day(CreatedOn)=day(getdate())
  15. and dt.diff%6=0
  16. and dt.diff/6>=1;
  1. Name CreatedOn diff dy_co
  2. Company A 2020-10-27 13:49:15.000 6 27
  3. Company D 2018-04-27 21:58:18.000 36 27

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

展开查看全部

相关问题