0
SELECT
  -- Subtract minute, second, millisecond part of date, effectively rounding to floor of the hour
  -- For example '2017-03-17T14:31:25.567' becomes '2017-03-17T14:00:00.000'
  DATEADD(
    mi, -1 * (DATEPART(mi, tab.logindt) % 60),
    DATEADD(
      ss, -1 * (DATEPART(ss, tab.logindt)),
      DATEADD(
        ms, -1 * (DATEPART(ms, tab.logindt)),
        tab.logindt
  )))      AS "Date",
  COUNT(*) AS "Count"
FROM TableName tab
WHERE
  tab.logindt BETWEEN 'Dec 1 2009 12:00 AM' AND 'Dec 2 2009 23:59 PM'            
GROUP BY
  DATEADD(
    mi, -1 * (DATEPART(mi, tab.logindt) % 60),
    DATEADD(
      ss, -1 * (DATEPART(ss, tab.logindt)),
      DATEADD(
        ms, -1 * (DATEPART(ms, tab.logindt)),
        tab.logindt
  )))

多くの人がログインするアプリケーションがあります。問題は、特定の時間にシステムにログインした人の数をカウントできるクエリを作成したいということです。

上記のクエリは、datepart を使用して作成されています。これにより、たとえば午前 10 時に署名した人の数を確認したり、サインアウトしたりできます。

たとえば、上記のクエリは午前 10 時に 10 人のサイン/サインアウトを返しますが、現在システムを使用している人は表示されません。

4

1 に答える 1

0

午前 10 時より前のすべてのログイン/ログアウト イベントを検索し、max(login) > max(logout) のようにそれらをフィルタリングします。

SELECT COUNT * FROM 
(SELECT *
FROM Table
WHERE login < 10am //your date function here!
and logout < 10am ) a
GROUP BY a.USER
HAVING MAX(a.login) > MAX(a.logout)

もしかして、そういうこと?

于 2009-12-06T12:33:30.470 に答える