簡體   English   中英

帶有日期過濾器的SQL查詢,間隔為14天

[英]SQL query with date filter with 14 day interval

我正在嘗試過濾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天間隔的日期,這不是正常的工資核算交易開始日期。 有人會有解決方案來遵守我的條件嗎?

這個怎么樣? 這使用遞歸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

SELECT trxbegdt FROM UPR30300 as where trxbegdt + interval 14 day = b.trxbegdt(SELECT trxbegdt FROM UPR30300 WHERE TRXBEGDT <= sysdate()and trxbegdt> ='2011-12-25')按順序排列TRXBEGDT desc

\n

您可以使用少量變體來獲得此恆定間隔的滾動日期。 例如

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

PS:在移動設備中格式化答案是非常痛苦的。 加上代碼是基於邏輯的,所以請在您的最后運行以查看結果並發表評論以獲得進一步的更新。

  • ALTERNATIVE ANSWER使用嵌套查詢生成具有恆定間隔的日期列表。

查詢以生成今天和指定日期之間的日期列表,間隔為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的本地機器上,通過用inner join替換in子句, 可以很好地滿足上述查詢。 但是它在SQLFIDDLE中仍然沒有。 因此,解決方法是在嵌套select查詢中使用delcare變量。 進一步的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM