日時フィールドがある場合、日付を完全に無視して、特定の時刻より後に作成されたレコードだけを取得するにはどうすればよいですか?
これはロギングテーブルであり、アプリケーションで人々が接続して何かをしていることを通知します。午後5時以降に人々がどのくらいの頻度でいるかを知りたい。
(申し訳ありません-それはSQL Serverです。しかし、これは他のデータベースの他の人にとって役立つかもしれません)
SQL Serverの場合:
select * from myTable where datepart(hh, myDateField) > 17
http://msdn.Microsoft.com/en-us/library/aa258265(SQL.80).aspx を参照してください。
どのデータベースシステムを使用していますか?日付/時刻関数は大きく異なります。
Oracleの場合、あなたは言うことができます
SELECT * FROM TABLE
WHERE TO_CHAR(THE_DATE, 'HH24:MI:SS') BETWEEN '17:00:00' AND '23:59:59';
また、おそらく翌日にロールオーバーし、午前0時から6時までの時間を選択する必要もあります。
MySQLでは、これは
where time(datetimefield) > '17:00:00'
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
私が考えることができる最良のことは、DateTimeフィールドを使用しないことです。 DATEADD/DATEPARTなどを大量に使用することもできますが、ここでは実際にインデックスを使用できないため、大量のデータがあると遅くなります。ご使用のDBは、適切なタイプ(SQL Server 2008のTIMEタイプなど)をネイティブで提供する場合がありますが、時間オフセットを分単位で(たとえば)簡単に格納できます。
単純な状況に対する別の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メソッドを使用します。
わかりました。
select myfield1,
myfield2,
mydatefield
from mytable
where datename(hour, mydatefield) > 17
これにより、午後5時より後のmydatefieldを持つレコードが取得されます。
Informixでは、DATETIME YEAR TO SECONDフィールドを使用して完全な日付を保持すると想定すると、次のように記述します。
WHERE EXTEND(dt_column, HOUR TO SECOND) > DATETIME(17:00:00) HOUR TO SECOND
「EXTEND」は実際にフィールドのセットを縮小できます(名前が示すように、フィールドを拡張することもできます)。
Thiloが述べたように、これはDBMS間で極端に変動する領域です(そしてInformixは確かにバリアントの1つです)。