@amuamuchan

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

前回の値との”差分”を算出する方法について教えてください

前回の値との差分を算出する方法

SQL学びたての元看護学生です。
現在企業でインターンを行っております。

そこで1つ課題にぶつかっており、以下お伺いできますと幸いです。
伝わりづらければ申し訳ございません。

■行いたいこと
・1週間以上ぶりにログインしたユーザーを抽出

■困っていること
・直近のログイン日(年月日)はカラムに保存されているが、1個前のログイン日は保存されていない
→そのため差分を抽出することができず、何日ぶりにログインしたのかわからない

■Qiitaの回答者様に伺いたいこと
・1個前のログイン日が保存されていない場合でも、差分を抽出するSQL文は存在するのでしょうか?

ご回答いただけますと嬉しい限りです。よろしくお願いいたします。

0 likes

2Answer

SQLServerで実装する方針と実装のイメージを回答致します。
※DBによって関数が異なったり、日数の差分が「ミリ秒」という単位で
 算出される場合があるので都度、合わせた方法を考える必要があります。
(あくまで、タグに「SQLServer」とございましたので今回はこちらで回答致します)

■方針
 直近のログイン日と、現在の日付の差分を算出する
 差分が7(日)以上であれば「1週間以上ぶり」のログインだと判定する

■SQLServerでの実装イメージ
 現在の日付を取得するために「GETDATE関数」を用いて
 差分を算出するために「DATEDIFF関数」を用います。

 「DATEDIFF関数」の基本構文は以下になります
 DATEDIFF ( datepart(差分の単位) , startdate(開始日) , enddate(終了日) )

 例として、
 SELECT DATEDIFF(day, '2022-04-07', '2022-04-05');
 とすると「-2」が返ってきます。
 (開始日と終了日の大小関係が逆の場合は正の数が返ってきます)
 
 そして、現在の日付と比較するわけですから、
 SELECT DATEDIFF(day, GETDATE関数で取得した現在日付, 直近のログイン日);
 このようなイメージになります。
 この時の差分が「-7」以下であれば「1週間以上ぶり」と判定できるわけです。

なんとなくイメージ掴めたでしょうか?
答えを直接記述すると、質問者様の学習に繋がらないと思い
恐縮ですがヒント程度に留めました。

各関数のより具体的な使用方法は
以下の公式ドキュメントをご参照ください。

0Like

Comments

  1. @amuamuchan

    Questioner

    ご回答いただきありがとうございます。大変丁寧な説明で非常に参考になりました。
    1点追加でご質問してもよろしいでしょうか?


    >>>直近のログイン日と、現在の日付の差分を算出する
    >>>差分が7(日)以上であれば「1週間以上ぶり」のログインだと判定する

    上記について疑問がございます。

    例えば、
    ・直近のログイン日→2022/4/7
    ・現在の日付→2022/4/9
    だとします。

    この場合、差分は2日となりますが、翌日には

    ・直近のログイン日→2022/4/7
    ・現在の日付→2022/4/10

    となり前者の「直近のログイン日」が変更になっていないにも関わらず、差分は3日となります。

    つまり前者の「直近のログイン日」が更新されていない場合でも、差分が7以上あれば1週間ぶりのログインという挙動が働いてしまうのは合っていない気がしているのですが、いかがでしょうか?

    私としては「1週間以上ぶりにログインした」というのがゴールになるため「現在の日付」というよりかは「直近のログイン日」と「1個前のログイン日」で比較するものなのでは?と考えている次第です。

    お手数ですがご確認のほどよろしくお願いいたします。
  2. 申し訳ありません。
    追加の質問について、意図が分かりかねます。
    なるべく汲み取ったうえで追加回答いたします。

    まず、ややこしいので、
    「直近のログイン日」と「1個前のログイン日」
    ではなく「最終ログイン日」という情報のみを持つとします。

    そして、以下の手順で処理を実施します。
    (ほぼ、@redpeaks33 氏の回答の通りになりますが)

    1.サイトにアクセスする
    2.ログイン認証する
    3.最終ログイン日と現在の日付(アクセス時の日付)を先の回答方法で比較する
    4.最終ログイン日を現在の日付に更新する

    以上で、正常に判定が行われると思われますが、
    いかがでしょうか。

処理としては

  1. ユーザがサイトにアクセス
  2. ログイン認証をする
  3. 直近のログイン日を更新する

ということをしていると思いますが、
2.と3.の間に、
現在の(アクセス時の)時刻と最終ログイン日時を比較すればOKです。
比較方法は@syutorum001さんの通りです。

0Like

Your answer might help someone💌