web-dev-qa-db-ja.com

SQL日時フィールドを使用して特定の時間の後にレコードを取得する方法

日時フィールドがある場合、日付を完全に無視して、特定の時刻より後に作成されたレコードだけを取得するにはどうすればよいですか?

これはロギングテーブルであり、アプリケーションで人々が接続して何かをしていることを通知します。午後5時以降に人々がどのくらいの頻度でいるかを知りたい。

(申し訳ありません-それはSQL Serverです。しかし、これは他のデータベースの他の人にとって役立つかもしれません)

16
thursdaysgeek

SQL Serverの場合:

select * from myTable where datepart(hh, myDateField) > 17

http://msdn.Microsoft.com/en-us/library/aa258265(SQL.80).aspx を参照してください。

20
Luke Bennett

どのデータベースシステムを使用していますか?日付/時刻関数は大きく異なります。

Oracleの場合、あなたは言うことができます

SELECT * FROM TABLE 
  WHERE TO_CHAR(THE_DATE, 'HH24:MI:SS') BETWEEN '17:00:00' AND '23:59:59';

また、おそらく翌日にロールオーバーし、午前0時から6時までの時間を選択する必要もあります。

5
Thilo

MySQLでは、これは

where time(datetimefield) > '17:00:00'
4
ysth

MSSQLの場合は、CONVERTメソッドを使用します。


DECLARE @TempDate   datetime = '1/2/2016 6:28:03 AM'
SELECT  
    @TempDate as PassedInDate,  
    CASE 
        WHEN CONVERT(nvarchar(30), @TempDate, 108) < '06:30:00' then 'Before 6:30am'
        ELSE 'On or after  6:30am'
    END,
    CASE 
        WHEN CONVERT(nvarchar(30), @TempDate, 108) >= '10:30:00' then 'On or after 10:30am'
        ELSE 'Before 10:30am'
    END 
1
Zaxxon

私が考えることができる最良のことは、DateTimeフィールドを使用しないことです。 DATEADD/DATEPARTなどを大量に使用することもできますが、ここでは実際にインデックスを使用できないため、大量のデータがあると遅くなります。ご使用のDBは、適切なタイプ(SQL Server 2008のTIMEタイプなど)をネイティブで提供する場合がありますが、時間オフセットを分単位で(たとえば)簡単に格納できます。

1
Marc Gravell

単純な状況に対する別のOracleの方法:

select ...
from   ...
where  EXTRACT(HOUR FROM my_date) >= 17
/

http://download.Oracle.com/docs/cd/B19306_01/server.102/b14200/functions050.htm#SQLRF00639

15:03:21から15:25:45までのすべてのレコードのように、いくつかの質問にはトリッキーです。そこでもTO_CHARメソッドを使用します。

0
David Aldridge

わかりました。

select myfield1, 
       myfield2, 
       mydatefield
  from mytable
 where datename(hour, mydatefield) > 17

これにより、午後5時より後のmydatefieldを持つレコードが取得されます。

0
thursdaysgeek

Informixでは、DATETIME YEAR TO SECONDフィールドを使用して完全な日付を保持すると想定すると、次のように記述します。

WHERE EXTEND(dt_column, HOUR TO SECOND) > DATETIME(17:00:00) HOUR TO SECOND

「EXTEND」は実際にフィールドのセットを縮小できます(名前が示すように、フィールドを拡張することもできます)。

Thiloが述べたように、これはDBMS間で極端に変動する領域です(そしてInformixは確かにバリアントの1つです)。

0