1

今日の日付と比較して過去24時間のデータを取得したい-1日。

問題は、テーブルに日時フィールドがないのに、日付が3つの部分(日/月/年)に分かれていることです。

私はこれを試しました:

select *
from user u
Where DAYOFMONTH (CURDATE () - INTERVAL 1 day) - u.Day <= 1
and MONTH (CURDATE ()) - = 0 u.Month
and YEAR (CURDATE ()) - = 0 u.Year

しかし、新しい月に入ると機能しません。

手伝ってくれませんか。

どうもありがとうございます

4

4 に答える 4

2

iso形式を使用すると、convertを使用して日時(tsql)を取得できます

このようなもの(テストされていません)

SELECT * from user u 
where DATEADD(day,-1,GETDATE()) < convert(datetime, u.Year + u.Month + u.Day )
于 2012-05-30T09:52:42.553 に答える
2

フィールドから実際の日付をフォーマットできます:DATE(CONCAT(u.Year, '-', u.Month, '-', u.Day)); 次に、通常の日付操作を実行できます(例:減算INTERVAL 1 DAY

于 2012-05-30T09:47:04.513 に答える
2

このクエリで解決できることを願っています。u.Month、u.Day、u.Yearが一貫していることを願っています。

select * from user u Where
STR_TO_DATE(CONCAT(u.Month,'-',u.Day,'-',u.Year), '%m-%d-%Y') = date_add(curdate() , INTERVAL -2 DAY)
于 2012-05-30T09:55:02.313 に答える
1

まず第一に、この計算の結果は正確ではありません。「過去24時間のデータを取得」したいのですが、時間を保存するのではなく、日付だけを保存します。したがって、データを取得できるのは、今日または今日と昨日のみです。

  • 今日のレコードのみをプルする場合:H00:00:01にデータをプルすると、境界条件が発生する可能性があります。時間の値を保存していないため、昨日からデータが失われます。これはおそらくすべてのデータを意味します。
  • 今日と昨日のレコードをプルする場合:H23:59:59にデータをプルすると、境界条件が発生する可能性があります。時間値を保存していないため、2日(-1秒)からデータを取得します。

結論として、テーブルに時間値を追加します。DATETIMEまたはTIMESTAMPデータ型の1つの列が望ましい(違いは範囲内のみ)。

あなたの質問に戻ります。基本的に、あなたがしたいことは次のとおりです。

/*
select * from table
where date >= now - 1 day;
*/

計算方法はnow - 1 day?機能DATE_SUB()付き:

DATE_SUB(NOW(), INTERVAL 1 DAY)

あなたのコラムから日付を作る方法は?とCONCAT_WS機能STR_TO_DATE()

STR_TO_DATE(CONCAT_WS('-', u.Day, u.Month, u.Year, '00', '00', '00'), '%d-%m-%Y-%H-%i-%s')

連結された文字列にはゼロがあります。これらの列をテーブルに追加するとすぐに、それらをu.Hour、に置き換えることができます。しかし、前に述べたように、カラムで達成できる最高のパフォーマンス。u.Minu.SecDATETIME

要約:

SELECT *
FROM users u
WHERE STR_TO_DATE(CONCAT_WS('-', u.Day, u.Month, u.Year, '00', '00', '00'), '%d-%m-%Y-%H-%i-%s') >= DATE_SUB(NOW(), INTERVAL 1 DAY)
于 2012-05-30T10:56:05.410 に答える