4

日付と時刻に基づいてレコードをクエリする高度な検索機能があります。日時範囲内のすべてのレコードを返し、その範囲内から結果を時間の範囲に絞り込みたい (たとえば、2012 年 5 月 1 日から 2012 年 5 月 7 日までのレコードを午後 2 時から午後 7 時まで表示する)。

私がしたことは、データベースに時間フィールドを追加し、AND ステートメントを使用して時間フィールドを確認することでした。これは、さまざまなタイムゾーンから調整するために、日時フィールドを時間数だけオフセットし始めるまではうまくいきました。これに関する問題は、時間フィールドが 6 時間オフセットされている場合です。たとえば、<=2pm<=7pm のような有効な時間クエリが <=8pm<=1am になり、ゼロの結果が返されます。

これを行うより良い方法はありますか?

クエリ:

SELECT Id, Item, 
       LEFT(DAYNAME(Date - INTERVAL 0 HOUR),3) as DayofWk, 
       CONCAT('$',FORMAT(Sale,2)) AS Sale, 
       CONCAT('$',FORMAT(Retail,2)) AS Retail,
       Date, Time, Winner 
  FROM masterdata2 
 WHERE Item LIKE '%xbox%' 
   AND Date BETWEEN CONCAT('2010-6-28', ' ', '00:00:00') + INTERVAL 0 HOUR 
            AND CONCAT ('2012-7-9',' ','23:59:00') + INTERVAL 0 HOUR 
   AND time BETWEEN CONCAT ('2010-6-28',' ','00:00:00') + INTERVAL 0 HOUR 
            AND CONCAT ('2012-7-9',' ','23:59:00') + INTERVAL 0 HOUR 
   AND ( Dayofwk != 'Mon' || Dayofwk != 'Tue' || Dayofwk != 'Wed' || Dayofwk != 'Thu' || Dayofwk != 'Fri' || Dayofwk != 'Sat' || Dayofwk != 'Sun' )
4

2 に答える 2

1

次の MySQL 関数を見てください。

最初の 2 つを使用すると、正確に同じ値を含む 2 つではなく 1 つの日時フィールドしか使用できませんでした。3 つ目では、タイムゾーン間で日時を変換できます。最後のものは、特定の型にキャストするために使用されます。この場合はCAST('22:00:00' AS TIME)=>のようなものJanuary, 01 1970 22:00:00-0800です。

  • 時間を日時と比較するのはなぜですか? あなたが言ったように、最初に結果を2 つのカレンダー日付の間のすべてのアイテムに制限し、次にそれらの日付の 2 つの時間の間のアイテムのみに制限します。これは次のような意味になります。
    [...]
    AND (DATE(sold) BETWEEN CAST('2010-06-20' AS DATE) AND CAST('2012-07-20' AS DATE))
    AND (
       (TIME(sold) >= CAST('22:00:00' AS TIME))
       OR
       (TIME(sold) <= CAST('02:00:00' AS TIME))
    )
    [...]
  • 私が理解しているように、オフセットされた時間が2日(または正午と真夜中?)にまたがると、クエリは失敗します。あなたがする必要があるのは、これを検出し、その夜のすべてのアイテムをキャッチしたい場合(開始日も同様に扱う場合)、最大日付を1ずつ増やすこと(から)だと思います2012-07-092012-07-10

  • 間違っている場合は、クエリが失敗する理由を詳しく説明していただけますか? 8pm < x < 1amは有効な期間ですが、なぜ結果が得られないのですか?

CREATE TABLE簡単な説明といくつかのサンプル データを提供していただけると、本当に助かります。そうすれば、クエリをいじることができます。

于 2012-07-10T15:33:06.470 に答える
0

わかりました、これを試してみましょう(私は新しいので私に簡単に行ってください):

CREATE TABLE abc (ID INT(255) UNSIGNED ZEROFILL,sold DATETIME);
INSERT INTO abc (ID, sold) VALUES
(1,'2012-06-01 18:00:00'),
(2,'2012-06-20 23:00:00'),
(3,'2012-07-01 00:00:00'),
(4,'2012-07-10 01:00:00'),
(5,'2012-07-15 02:00:00'),
(6,'2012-07-20 12:00:00');
SELECT ID, sold
FROM abc
WHERE
(DATE(sold) BETWEEN '2012-06-20' AND '2012-07-20')
AND
(TIME(sold) BETWEEN '23:00:00' AND '02:00:00');

これにより、テーブルが作成され、クエリが実行されます。結果は#2〜#5を返すはずですが、18:00:00から02:00:00の間などがないため、結果はゼロになります。ただし、2:00:00と18:00:00の間にデータがあります。問題は、時間を+時間オフセットすると、18:00:00と02:00:00になることがあるということです。どうすればよいですか?

私のデータはすべてEDTにあります。タイムゾーン関数を使用する必要がありますか?

お手伝いありがとう!!

于 2012-07-11T19:28:58.493 に答える