0

id、startDateTime、endDateTimeで設定されたテーブルをクエリしようとしています。行1が次のようになっているとしましょう。

id      startDateTime      endDateTime      
100     2/9/2012 20:55     3/21/2012 10:43

上記の範囲内のすべての日数を明確にカウントするように、上記を照会する必要があります。2/9から3/21までの42の固有の暦日があるため、私の期待される結果は上記の42になります。タイムピースを見るとDatediffは私に41日を与えます。これを機能させるためにdatediffとtimediffのさまざまな反復を試しましたが、すべてのシナリオで機能するものを見つけることができません。これをSQLでどのように実行できるかについての提案はありますか?

以下に示すようなクエリから始めました。

SELECT ConditionStatus.ID, 
  SUM((DATEDIFF(ConditionStatus.endDate,ConditionStatus.startDate))) AS Duration 
WHERE ID = 100

私のクエリは技術的に正確な41の期間を返しますが、日付の範囲内のすべての日付が1のカウントを取得するように条件付けする必要があります

データウェアハウスで使用しているロジックを模倣しようとしています。このロジックでは、アクティビティが発生した日付ごとに1のカウントを保持しています。

ありがとう、ボブ

4

2 に答える 2

3

基本的な答えは、DATEDIFF()当日を含めたいので、1を使用して追加できるということです。

例えば:

mysql> select datediff(current_date(),current_date()) + 1;
+---------------------------------------------+
| datediff(current_date(),current_date()) + 1 |
+---------------------------------------------+
|                                           1 |
+---------------------------------------------+
1 row in set (0.00 sec)

元の例を拡張すると、文字列を日時に変換し、時刻コンポーネントを破棄してから、次のようなクエリを使用して包括的日付カウントを計算できます。

mysql> SELECT ABS(DATEDIFF(DATE(STR_TO_DATE('2/9/2012 20:55','%m/%d/%Y %H:%i')),
    ->          DATE(STR_TO_DATE('3/21/2012 10:43','%m/%d/%Y %H:%i')))) + 1 as days_in_range;
+---------------+
| days_in_range |
+---------------+
|            42 |
+---------------+
1 row in set (0.00 sec)

mysql> SELECT ABS(DATEDIFF(DATE(STR_TO_DATE('3/21/2012 10:43','%m/%d/%Y %H:%i')),
    ->          DATE(STR_TO_DATE('2/9/2012 20:55','%m/%d/%Y %H:%i')))) + 1 as days_in_range;
+---------------+
| days_in_range |
+---------------+
|            42 |
+---------------+
1 row in set (0.00 sec)
于 2012-05-16T18:51:53.907 に答える
0

この回答を参照してください-日付範囲内の個別の日数を選択するにはどうすればよいですか?

@Ikeの答えを使用する前に見てください。+1を追加すると、時間値が00:00:00の場合に取得する数が多すぎます。

select datediff(days, '2/9/2012 20:55', '3/21/2012 10:43')41を返します

select datediff(days, '2/9/2012 20:55', '3/21/2012 10:43') + 142を返します

これはそれが壊れるところです-

select datediff(days, '2/9/2012 20:55', '3/21/2012 00:00:00') + 142を返します

それは間違った答えです。最終日は含めないでください。

回避策は次のとおりです-

datediff(days, '2/9/2012 20:55', dateadd(seconds, -1, '3/21/2012 00:00:00') + 1

于 2018-01-25T08:20:24.377 に答える