sql >> データベース >  >> RDS >> Mysql

2つの日付の間の平日の数を数えたい

    1つのアプローチは、日/日付の具体化されたテーブルを作成することです。ただし、このマテリアライズドテーブルの作成に使用されるこの同じメソッドは、クエリで直接使用できます。 [平日]の計算をいくつか示しますが、同じアプローチを使用して週末についてクエリを実行できます(週末の値は5と6です):

    直接単一クエリの例:

    SELECT day
         , WEEKDAY(day) AS wkday
      FROM (
    SELECT FROM_DAYS(d.day1+v1.result) AS day
      FROM (SELECT TO_DAYS(DATE('2000-01-01')) AS day1
                 , TO_DAYS(DATE('2021-01-01')) AS day2
         ) AS d
      JOIN (
          SELECT v1.num+v2.num+v3.num+v4.num AS result
            FROM (
                     SELECT 1 AS num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5
               UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0
               ) AS v1
            JOIN (
                     SELECT 10 AS num UNION SELECT 20 UNION SELECT 30 UNION SELECT 40 UNION SELECT 50
               UNION SELECT 60 UNION SELECT 70 UNION SELECT 80 UNION SELECT 90 UNION SELECT 00
               ) AS v2
            JOIN (
                     SELECT 100 AS num UNION SELECT 200 UNION SELECT 300 UNION SELECT 400 UNION SELECT 500
               UNION SELECT 600 UNION SELECT 700 UNION SELECT 800 UNION SELECT 900 UNION SELECT 000
               ) AS v3
            JOIN (
                     SELECT 1000 AS num UNION SELECT 2000 UNION SELECT 3000 UNION SELECT 4000 UNION SELECT 5000
               UNION SELECT 6000 UNION SELECT 7000 UNION SELECT 8000 UNION SELECT 9000 UNION SELECT 0000
               ) AS v4
         ) v1
     WHERE v1.result < (d.day2-d.day1)
         ) AS days
     WHERE WEEKDAY(day) < 5
     LIMIT 10
    ;
    
    
    
    USE test;
    
    DROP TABLE IF EXISTS days;
    
    CREATE TABLE days (
       day   date PRIMARY KEY
    ) ENGINE = InnoDB;
    
    INSERT INTO days
    SELECT FROM_DAYS(d.day1+v1.result)
      FROM (SELECT TO_DAYS(DATE('2000-01-01')) AS day1
                 , TO_DAYS(DATE('2021-01-01')) AS day2
         ) AS d
      JOIN (
          SELECT v1.num+v2.num+v3.num+v4.num AS result
            FROM (
                     SELECT 1 AS num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5
               UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0
               ) AS v1
            JOIN (
                     SELECT 10 AS num UNION SELECT 20 UNION SELECT 30 UNION SELECT 40 UNION SELECT 50
               UNION SELECT 60 UNION SELECT 70 UNION SELECT 80 UNION SELECT 90 UNION SELECT 00
               ) AS v2
            JOIN (
                     SELECT 100 AS num UNION SELECT 200 UNION SELECT 300 UNION SELECT 400 UNION SELECT 500
               UNION SELECT 600 UNION SELECT 700 UNION SELECT 800 UNION SELECT 900 UNION SELECT 000
               ) AS v3
            JOIN (
                     SELECT 1000 AS num UNION SELECT 2000 UNION SELECT 3000 UNION SELECT 4000 UNION SELECT 5000
               UNION SELECT 6000 UNION SELECT 7000 UNION SELECT 8000 UNION SELECT 9000 UNION SELECT 0000
               ) AS v4
         ) v1
     WHERE v1.result < (d.day2-d.day1)
    ;
    
    SELECT *
      FROM days
     ORDER BY day
     LIMIT 10
    ;
    
    
    SELECT COUNT(*) FROM days;
    
    SELECT MIN(day), MAX(day) FROM days;
    
    SELECT day, WEEKDAY(day) FROM days LIMIT 6;
    
    SELECT day, WEEKDAY(day) AS wkday FROM days WHERE WEEKDAY(day) < 5 LIMIT 6;
    
    SELECT COUNT(*), MIN(day), MAX(day) FROM days WHERE WEEKDAY(day) < 5;
    


    1. MySQLのタイムスタンプを現地時間で表示する

    2. SqlAlchemyモデルクラス定義内の@propertyを介したPythonゲッターとセッター:HOWTO

    3. ユキヒョウにmysqldbをインストールする

    4. postgresを使用したSqlalchemy。 「DISTINCT」ではなく「DISTINCTON」を取得してみてください