SQLでNow()
関数を使用して今日の日付の値を選択する方法はありますか?
Now()
には日付と時刻が含まれるという印象を受けましたが、今日の日付には時刻が00:00:00
に設定されているため、これは一致しませんか?
SQL ServerにはネイティブのNow()関数がないため、次を使用する必要があります。
select GETDATE() --2012-05-01 10:14:13.403
以下を実行することで、日、月、年を個別に取得できます。
select DAY(getdate()) --1
select month(getdate()) --5
select year(getdate()) --2012
sQL Server 2008を使用している場合、日付ではなく日付部分のみが含まれる日付時刻があります。
select cast (GETDATE() as DATE) --2012-05-01
OK、これを適切に行いましょう。現在一致する日付を選択し、可能な場合はインデックスを使用して、すべての異なる日付/時刻タイプを提示します。
ここでの原則は、いずれの場合も同じです。日付列が最新の深夜(時刻00:00:00の今日の日付)以降または次の真夜中(時刻00:00:00の明日の日付であるが、その正確な値を持つものを除く)の行を取得します)。
純粋な日付タイプの場合、今日の日付と簡単に比較できます。
物事を迅速かつ迅速に保つために、DB(以下のすべての例のwhere
句のLHS)に保存されている日付の操作を明示的に避けています。これは、比較ごとに日付を計算する必要があるため、潜在的に全表スキャンをトリガーします。 (この動作はDBMS、YMMVによって異なるようです)。
MS SQL Server:( SQL Fiddle | db <> fiddle )
まず、DATEを使用して
select * from dates
where dte = CAST(CURRENT_TIMESTAMP AS DATE)
;
DATETIMEを使用:
select * from datetimes
where dtm >= CAST(CURRENT_TIMESTAMP AS DATE)
and dtm < DATEADD(DD, 1, CAST(CURRENT_TIMESTAMP AS DATE))
;
最後にDATETIME2で:
select * from datetimes2
where dtm2 >= CAST(CURRENT_TIMESTAMP AS DATE)
and dtm2 < DATEADD(DD, 1, CAST(CURRENT_TIMESTAMP AS DATE))
;
MySQL:( SQL Fiddle | db <> fiddle )
DATEを使用:
select * from dates
where dte = cast(now() as date)
;
DATETIMEの使用:
select * from datetimes
where dtm >= cast((now()) as date)
and dtm < cast((now() + interval 1 day) as date)
;
PostgreSQL:( SQL Fiddle | db <> fiddle )
DATEを使用:
select * from dates
where dte = current_date
;
タイムゾーンなしでTIMESTAMPを使用する:
select * from timestamps
where ts >= 'today'
and ts < 'tomorrow'
;
Oracle:( SQL Fiddle )
DATEを使用:
select to_char(dte, 'YYYY-MM-DD HH24:MI:SS') dte
from dates
where dte >= trunc(current_date)
and dte < trunc(current_date) + 1
;
TIMESTAMPの使用:
select to_char(ts, 'YYYY-MM-DD HH24:MI:SS') ts
from timestamps
where ts >= trunc(current_date)
and ts < trunc(current_date) + 1
;
SQLite:( SQL Fiddle )
日付文字列の使用:
select * from dates
where dte = (select date('now'))
;
日付と時刻の文字列を使用する:
select dtm from datetimes
where dtm >= datetime(date('now'))
and dtm < datetime(date('now', '+1 day'))
;
UNIXタイムスタンプの使用:
select datetime(dtm, 'unixepoch', 'localtime') from datetimes
where dtm >= strftime('%s', date('now'))
and dtm < strftime('%s', date('now', '+1 day'))
;
あなたの質問がわからない!
しかしながら
SELECT GETDATE()
現在の日付と時刻を取得します
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
時間を00:00:00に設定した日付だけを取得します
あなたが何をしようとしているのか正確にはわかりませんが、GETDATE()
があなたが望んでいるようです。 GETDATE()
は日付時刻を返しますが、時刻コンポーネントに関心がない場合は、日付にキャストできます。
SELECT GETDATE()
SELECT CAST(GETDATE() AS DATE)
日付の時間要素をゼロにするだけです。例えば.
SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
タグ付けしたように、MSDate関数としてGetDateを使用しましたが、Now()
はおそらくMySQLであるか、ODBC関数呼び出しを使用しています。
前の回答に基づいて、重要な点に注意してください。また、テーブルの列を操作するがdatetimeデータ型の時間フラグメントを含まないようにする必要があります。
以下は、上記を示す小さなサンプルスクリプトです。
select getdate()
--2012-05-01 12:06:51.413
select cast(getdate() as date)
--2012-05-01
--we're using sysobjects for the example
create table test (id int)
select * from sysobjects where cast(crdate as date) = cast(getdate() as date)
--resultset contains only objects created today
drop table test
これがお役に立てば幸いです。
編集:
上記の例がパフォーマンスに与える影響についての@dwurfコメント(感謝)に従って、代わりに以下を提案したいと思います。今日の真夜中(1日の開始)からその日の最後のミリ秒までの日付範囲を作成します(SQLサーバーは最大.997までカウントするため、3ミリ秒削減しています)。この方法では、左側の操作を避け、パフォーマンスへの影響を避けます。
select getdate()
--2012-05-01 12:06:51.413
select dateadd(millisecond, -3, cast(cast(getdate()+1 as date) as datetime))
--2012-05-01 23:59:59.997
select cast(getdate() as date)
--2012-05-01
create table test (id int)
select * from sysobjects where crdate between cast(getdate() as date) and dateadd(millisecond, -3, cast(cast(getdate()+1 as date) as datetime))
--resultset contains only objects created today
drop table test
保存された日付(時刻なし)だけのテーブルがあり、それらを「今」までに取得したい場合、これを行うことができます:
SELECT * FROM tbl WHERE DATEDIFF(d, yourdate, GETDATE())=0
これにより、日差が0(今日)の行が生成されます。
あなたが試すことができます:
WHERE created_date BETWEEN CURRENT_TIMESTAMP-180 AND CURRENT_TIMESTAMP
このSQLコードを試すことができます。
SELECT [column_1], [column_1], ...
FROM (your_table)
where date_format(record_date, '%e%c%Y') = date_format(now(), '%e%c%Y')