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 + interval 14 day = b.trxbegdt(SELECT trxbegdt FROM UPR30300 WHERE TRXBEGDT <= sysdate()and trxbegdt> = '2011-12-25')As b order by 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 に答える