0

こんにちは現在、過去 1 時間のレコードの合計を 10 分間隔で表示するコードがあります。

SELECT SUM(NO_OF_ADULT) AS ADULT
     , SUM(NO_OF_ADULT_F) AS ADULT_F
     , SUM(NO_OF_CHILDREN) AS CHILDREN
     , SUM(NO_OF_CHILDREN_F) AS CHILDREN_F
     , SUM(NO_OF_SENIOR_CITIZEN) AS SENIOR
     , SUM(NO_OF_SENIOR_CITIZEN_F) AS SENIOR_F
     , SUM(NO_OF_INFANT) AS INFANT
     , SUM(NO_OF_INFANT_F) AS INFANT_F
     , SUBSTR(END_TIME_OF_SERVICE, 1, 4) || '0 - ' || SUBSTR(END_TIME_OF_SERVICE, 1, 4) || '9' AS TIME_SLOT
  FROM CLNT_RESERVATION RES
      , CLNT_ORDER ORD
      , CLNT_ORDER_CHEQUE_RESERVATION_MAPPING RM
  WHERE RES.START_DATE_OF_SERVICE ="2012-09-24"
    AND ORD.ENT_CODE="****"
    AND ORD.BRANCH_CODE="******"
    AND ORD.STATION_CODE="*******"
    AND RES.STATION_CODE=ORD.STATION_CODE 
    AND ORD.ORDER_STATUS <> 111 
    AND ORD.ORDER_ID=RM.ORDER_ID 
    AND (ORD.CREATE_TIME LIKE "2012-09-24%" OR ORD.UPDATE_TIME LIKE "2012-09-24%")
    AND ORD.STATUS_FLG ="A"
    AND ORD.DELETE_FLG="N" 
    AND RM.RESERVATION_ID = RES.RESERVATION_ID 
    AND (strftime("%H:%M", RES.END_TIME_OF_SERVICE) BETWEEN strftime("%H:%M",TIME("now","localtime","-1 hour","-00 minutes")) 
    AND strftime ("%H:%M",TIME("now","localtime")) OR strftime("%H:%M", RES.END_TIME_OF_SERVICE) BETWEEN strftime("%H:%M",TIME("now","localtime","-1 hour","-00 minutes")) 
    AND strftime("%H:%M",TIME("now","localtime")) ) 
GROUP BY 9

以下のような出力が得られます

ADULT  ADULT_F  CHILDREN CHILDREN_F SENIOR SENIOR_F INFANT INFANT_F  TIME_SLOT

 0       0         0       0          1        1      0      0     12:00 - 12:09
 1       0         0       0          0        1      0      0     12:30 - 12:39

これで、12:10 ~ 12:29 の値がデータベースにないため、表示されないことがわかります。

私が期待しているのは: - 1) 行を作成する必要があり、すべてのフィールドに 0 を入力するだけです。(高) 2) time_slot は、現在の time_stamp から計算する必要があります。(中)

これは役に立ちます。解決策を教えてください。時間を割いていただきありがとうございます。

4

1 に答える 1

0
  1. データベースは、そこにないデータのレコードを作成しません。
    すべてのタイム スロットのレコードを取得する場合 (結果を読み取るときにアプリケーションでこれを処理できない場合)、ゼロで満たされたレコードをテーブルに追加する必要があります。(合計が影響を受けないため、必要なすべてのタイムスロットに対してやみくもにこれを行うことができます。)
  2. SQL の文字列には、常に「一重引用符」を使用してください。SQLite は、他の SQL エンジンとの互換性のために二重引用符を受け入れますが、同じ名前の列があると、見つけにくいエラーが発生します。
  3. TIME(...)これらの呼び出しは必要ありません。直接使用できますstrftime('%H:%M','now','localtime')
  4. 現在の時刻に基づいて 10 分のタイム スロットを取得するには、時間を h/m/s フィールドに分割せずに計算を行う必要があります。これは、前の質問ですでに示されています。
SELECT DATETIME(strftime('%s', SERVICE) +
                ((strftime('%s', 'now') - strftime('%s', SERVICE))
                 % (60 * 10)),
                'unixepoch') ...
于 2012-09-24T08:05:45.283 に答える