78

Now()SQLの関数を使用して、今日の日付の値を選択する方法はありますか?

日付だけでなく時間も含まれているという印象を受けましたNow()が、今日の日付には時刻が設定され00:00:00ているので、これは決して一致しませんか?

4

11 に答える 11

109

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))
;

MySQL: ( SQL フィドル| db<>フィドル)

日付の使用:

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 Fiddle コードのバックアップ

于 2012-05-01T08:50:42.120 に答える
86

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
于 2012-05-01T09:16:13.140 に答える
7

日付の時間要素をゼロにするだけです。例えば

SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

あなたがタグ付けしたように、私はGetDateをMSSQL関数として使用しましたが、Now()おそらくMySQLであるか、ODBC関数呼び出しを使用していますが、一方を他方に置き換えるだけでも機能するはずです。

于 2012-05-01T08:52:00.053 に答える
7

あなたの質問がわからない!

でも

SELECT  GETDATE()

現在の日付と時刻を取得します

SELECT  DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

時刻が 00:00:00 に設定された日付のみを取得します

于 2012-05-01T08:55:59.053 に答える
6

何をしようとしているのか正確にはわかりませんが、それはあなたが求めていることのようGETDATE()です。GETDATE()日時を返しますが、時間コンポーネントに関心がない場合は、日付にキャストできます。

SELECT  GETDATE()
SELECT  CAST(GETDATE() AS DATE)
于 2012-05-01T08:51:00.450 に答える
3

前の回答に基づいて、重要な点に注意してください。テーブル列を操作して、日時データ型の時間フラグメントが含まれないようにする必要もあります。

以下は、上記を示す小さなサンプル スクリプトです。

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
于 2012-05-01T09:11:14.693 に答える
2

保存された日付のみ (時刻なし) のテーブルがあり、それらを「今」までに取得したい場合は、次のようにします。

SELECT * FROM tbl WHERE DATEDIFF(d, yourdate, GETDATE())=0

これにより、日差が 0 (今日) の行が生成されます。

于 2012-05-01T09:12:45.167 に答える
0

あなたが試すことができます:

WHERE created_date BETWEEN CURRENT_TIMESTAMP-180 AND CURRENT_TIMESTAMP
于 2016-08-10T04:51:54.657 に答える
0

この SQL コードを試すことができます。

   SELECT [column_1], [column_1], ...    
    FROM (your_table)
     where date_format(record_date, '%e%c%Y') = date_format(now(), '%e%c%Y') 
于 2015-10-22T07:34:13.950 に答える
0

これは私のために働いた:

SELECT * FROM table where date(column_date) = curdate()
于 2019-08-21T13:16:35.587 に答える