developer tip

결과를 오늘 날짜와 비교 하시겠습니까?

copycodes 2020. 11. 16. 21:39
반응형

결과를 오늘 날짜와 비교 하시겠습니까?


Now()오늘 날짜로 값을 선택하기 위해 SQL 에서 함수 를 사용하는 방법이 있습니까?

나는 인상 아래에 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을 사용하는 경우 시간이 아닌 날짜 부분 만있는 DATE 날짜 시간이 있습니다.

select cast (GETDATE() as DATE) --2012-05-01

좋아, 제대로 해보자. 가능한 경우 색인을 사용하여 모든 다른 날짜 / 시간 유형이있는 오늘과 일치하는 날짜를 선택하십시오.

여기의 원칙은 각 경우에 동일합니다. 날짜 열이 가장 최근 자정 또는 그 이후 (오늘 날짜가 00:00:00) 인 행과 다음 자정 이전 (내일 날짜가 00:00:00이지만 정확한 값을 가진 항목은 제외) 인 행을 가져옵니다. ).

순수한 날짜 유형의 경우 오늘 날짜와 간단한 비교를 수행 할 수 있습니다.

일을 멋지고 빠르게 유지하기 위해 DB에 저장된 날짜 ( where아래의 모든 예제에서 절의 LHS)에 대한 조작을 명시 적으로 피 합니다. 모든 비교에 대해 날짜를 계산해야하므로 잠재적으로 전체 테이블 스캔을 트리거합니다. (이 동작은 DBMS, YMMV에 따라 다릅니다.)

MS SQL 서버 : ( 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
;

TIME ZONE없이 TIMESTAMP 사용 :

select * from timestamps
where ts >= 'today'
and ts < 'tomorrow'
;

오라클 : ( 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'))
;

유닉스 타임 스탬프 사용 :

select datetime(dtm, 'unixepoch', 'localtime') from datetimes
where dtm >= strftime('%s', date('now'))
and dtm < strftime('%s', date('now', '+1 day'))
;

SQL Fiddle 코드 백업


당신이 무엇을 요구하는지 확실하지 않습니다!

하나

SELECT  GETDATE()

현재 날짜와 시간을 알려줍니다.

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

시간이 00:00:00으로 설정된 날짜 만 표시됩니다.


Not sure exactly what you're trying to do, but it sounds like GETDATE() is what you're after. GETDATE() returns a datetime, but if you're not interested in the time component then you can cast to a date.

SELECT  GETDATE()
SELECT  CAST(GETDATE() AS DATE)

Just zero off the time element of the date. e.g.

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

I've used GetDate as that's an MSSQL function, as you've tagged, but Now() is probably MySQL or you're using the ODBC function call, still should work if you just replace one with the other.


Building on the previous answers, please note an important point, you also need to manipulate your table column to ensure it does not contain the time fragment of the datetime datatype.

Below is a small sample script demonstrating the above:

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

I hope this helps.

EDIT:
Following @dwurf comment (thanks) about the effect the above example may have on performance, I would like to suggest the following instead. We create a date range between today at midnight (start of day) and the last millisecond of the day (SQL server count up to .997, that's why I'm reducing 3 milliseconds). In this manner we avoid manipulating the left side and avoid the performance impact.

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

If you have a table with just a stored date (no time) and want to get those by "now", then you can do this:

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

This results in rows which day difference is 0 (so today).


You can try this sql code;

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

You can try:

WHERE created_date BETWEEN CURRENT_TIMESTAMP-180 AND CURRENT_TIMESTAMP

This worked for me:

SELECT * FROM table where date(column_date) = curdate()

참고URL : https://stackoverflow.com/questions/10395459/comparing-results-with-todays-date

반응형