web-dev-qa-db-ja.com

結果を今日の日付と比較しますか?

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

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

64
mezamorphic

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
71
Diego

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

SQL Fiddleコードのバックアップ

91
dwurf

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

しかしながら

SELECT  GETDATE()

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

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

時間を00:00:00に設定した日付だけを取得します

7
David Adlington

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

SELECT  GETDATE()
SELECT  CAST(GETDATE() AS DATE)
5
Jonathan Sayce

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

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

タグ付けしたように、MSDate関数としてGetDateを使用しましたが、Now()はおそらくMySQLであるか、ODBC関数呼び出しを使用しています。

5
Paul

前の回答に基づいて、重要な点に注意してください。また、テーブルの列を操作するが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
3
itayw

保存された日付(時刻なし)だけのテーブルがあり、それらを「今」までに取得したい場合、これを行うことができます:

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

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

2
YvesR

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

WHERE created_date BETWEEN CURRENT_TIMESTAMP-180 AND CURRENT_TIMESTAMP
0
Sriram R iyer

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

   SELECT [column_1], [column_1], ...    
    FROM (your_table)
     where date_format(record_date, '%e%c%Y') = date_format(now(), '%e%c%Y') 
0
erdemildiz