1

我正在尝试过滤payroll dates结果将在哪里显示“2011-12-25”以及之后每 14 天up until today

我的查询是:

 SELECT trxbegdt FROM UPR30300
    WHERE TRXBEGDT <= getdate() and trxbegdt >= DATEADD( DAY ,14, '2011-12-25')
    group by trxbegdt
    order by TRXBEGDT desc

我遇到的问题是结果显示的日期超出了 14 天的间隔,这不是正常的工资单交易开始日期。有人有解决方案来遵守我的条件吗?

4

2 回答 2

3

这个怎么样?这使用递归 CTE 创建有效工资单日期列表,然后将其连接到真实表......

WITH PayrollDates AS
(
  SELECT CONVERT(datetime,'2011-12-25') AS PayrollDate
  UNION ALL
  SELECT DATEADD(DAY,14,PayrollDate) AS PayrollDate
  FROM PayrollDates
  WHERE DATEADD(DAY,14,PayrollDate) <= GETDATE()
)
SELECT 
  UPR30300.trxbegdt 
FROM UPR30300
INNER JOIN PayrollDates
ON UPR30300.trxbegdt = PayrollDates.PayrollDate
于 2012-12-07T23:38:36.007 回答
0

SELECT trxbegdt FROM UPR30300 as a where trxbegdt + 间隔 14 天 = b.trxbegdt (SELECT trxbegdt FROM UPR30300 WHERE TRXBEGDT <= sysdate() and trxbegdt >= '2011-12-25' ) 由 TRXBEGDT desc 订购

您可以使用一些变体来获得具有此恒定间隔的滚动日期。例如

  • Datediff(day,a.trxbegdt,b.trxbegdt) = 14
  • dateadd(b.trxbegdt,14,day)= a.trbegdt

PS:在手机中格式化答案非常痛苦。此外,代码是基于逻辑的,因此请在您的最后运行以查看结果并评论进一步更新。

查询以生成从今天到您指定日期之间的日期列表,间隔为 14 天

set @i:= 0;

SELECT date_format(DATE(ADDDATE('2012-10-05', 
INTERVAL @i:=@i+14 DAY)),'%Y-%m-%d')
AS dateP, @i
FROM payroll
HAVING @i < datediff(now(), date '2012-10-05')
;

以上查询输出

DATEP         @IntervalDays
2012-10-19    14
2012-11-02    28
2012-11-16    42
2012-11-30    56
2012-12-14    70

应该获取记录的最终查询

set @i:= 0;

SELECT distinct datestamp FROM payroll
WHERE date(datestamp) in (
SELECT DATE(ADDDATE('2012-10-05', 
INTERVAL @i:=@i+14 DAY) ) AS dateP
FROM payroll
where @i < DATEDIFF(now(), date '2012-10-05') 
)
;

然而,由于某些 MYSQL 引擎的行为,它没有获取记录,迄今为止比较无知。所以我想现在,你最好用上面的答案。我想用信息更新这篇文章,以分享知识。

随意评论:)


  • 解决上述变量范围后的更新。

至于调查结果,在安装了 mysql 的本地机器上,通过将in子句替换为inner join. 但是它仍然不能在 SQLFIDDLE 中使用。所以解决方法是在嵌套select查询中删除变量。进一步IN的条款似乎也不能很好地工作。无论如何,inner join胜过in条款。所以最终的解决方案如下。:)

询问:

select p.id, p.datestamp, s.datep from
Payroll as p
inner join 
(
SELECT DATE(DATE_ADD('2012-10-05', 
INTERVAL @i:=@i+14 DAY) ) AS dateP
FROM Payroll, (SELECT @i:=0) r
where @i < DATEDIFF(now(), date '2012-10-05') 
) as s 
on p.datestamp = s.dateP
;

结果:

ID  DATESTAMP                           DATEP
7   October, 19 2012 00:00:00+0000      October, 19 2012 00:00:00+0000
8   November, 02 2012 00:00:00+0000     November, 02 2012 00:00:00+0000
10  November, 16 2012 00:00:00+0000     November, 16 2012 00:00:00+0000
12  November, 30 2012 00:00:00+0000     November, 30 2012 00:00:00+0000
于 2012-12-07T23:30:50.417 回答