Now()
SQLの関数を使用して、今日の日付の値を選択する方法はありますか?
日付だけでなく時間も含まれているという印象を受けましたNow()
が、今日の日付には時刻が設定され00:00:00
ているので、これは決して一致しませんか?
Now()
SQLの関数を使用して、今日の日付の値を選択する方法はありますか?
日付だけでなく時間も含まれているという印象を受けましたNow()
が、今日の日付には時刻が設定され00:00:00
ているので、これは決して一致しませんか?
OK、これを適切に行いましょう。可能な場合はインデックスを使用して、今日と一致する日付を選択し、さまざまな日付/時刻の種類がすべて存在するようにします。
ここでの原則は、いずれの場合も同じです。日付列が直近の午前 0 時以降 (時刻が 00:00:00 の今日の日付) で、次の午前 0 時 (時刻が 00:00:00 の明日の日付) より前の行を取得しますが、その正確な値を持つものは除外されます。 )。
純粋な日付型の場合、今日の日付と簡単に比較できます。
物事を適切かつ高速に保つために、DB に格納されている日付 (where
以下のすべての例の句の LHS) に対する操作を明示的に避けています。これにより、すべての比較で日付を計算する必要があるため、テーブル全体のスキャンがトリガーされる可能性があります。(この動作は、DBMS、YMMV によって異なるようです)。
MS SQL Server: ( SQL フィドル| db<>フィドル)
まず、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))
;
日付の使用:
select * from dates
where dte = cast(now() as date)
;
日時の使用:
select * from datetimes
where dtm >= cast((now()) as date)
and dtm < cast((now() + interval 1 day) as date)
;
PostgreSQL: ( SQL フィドル| db<>フィドル)
日付の使用:
select * from dates
where dte = current_date
;
タイムゾーンなしの TIMESTAMP の使用:
select * from timestamps
where ts >= 'today'
and ts < 'tomorrow'
;
オラクル: ( SQL フィドル)
日付の使用:
select to_char(dte, 'YYYY-MM-DD HH24:MI:SS') dte
from dates
where dte >= trunc(current_date)
and dte < trunc(current_date) + 1
;
タイムスタンプの使用:
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 フィドル)
日付文字列の使用:
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'))
;
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 を使用している場合、時刻ではなく日付部分のみを持つ DATE 日時があります。
select cast (GETDATE() as DATE) --2012-05-01
日付の時間要素をゼロにするだけです。例えば
SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
あなたがタグ付けしたように、私はGetDateをMSSQL関数として使用しましたが、Now()
おそらくMySQLであるか、ODBC関数呼び出しを使用していますが、一方を他方に置き換えるだけでも機能するはずです。
あなたの質問がわからない!
でも
SELECT GETDATE()
現在の日付と時刻を取得します
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
時刻が 00:00:00 に設定された日付のみを取得します
何をしようとしているのか正確にはわかりませんが、それはあなたが求めていることのようGETDATE()
です。GETDATE()
日時を返しますが、時間コンポーネントに関心がない場合は、日付にキャストできます。
SELECT GETDATE()
SELECT CAST(GETDATE() AS DATE)
前の回答に基づいて、重要な点に注意してください。テーブル列を操作して、日時データ型の時間フラグメントが含まれないようにする必要もあります。
以下は、上記を示す小さなサンプル スクリプトです。
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')
これは私のために働いた:
SELECT * FROM table where date(column_date) = curdate()