Сравнение результатов с сегодняшней датой?



есть ли способ, чтобы использовать Now() функция в SQL для выбора значений с сегодняшней датой?



Я был под впечатлением Now() будет содержать время и дату, но сегодня нет времени для 00:00:00 и поэтому это никогда не будет соответствовать?

554   9  

9 ответов:

в SQL Server Нет функции native 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

хорошо, давайте сделаем это правильно. Выберите даты, соответствующие сегодняшнему дню, используя индексы, если они доступны, со всеми различными типами даты/времени.

принцип здесь один и тот же в каждом случае. Мы берем строки, где столбец даты включен или после самой последней полуночи (сегодняшняя дата со временем 00:00:00) и до следующей полуночи (завтрашняя дата со временем 00:00:00, но исключая все, что имеет это точное значение).

для чистых типов, мы можем сделать простой сравнение с сегодняшней датой.

чтобы все было хорошо и быстро, мы явно избегаем каких-либо манипуляций с датами, хранящимися в БД (LHS where пункт во всех примерах ниже). Это потенциально вызовет полное сканирование таблицы, поскольку дата должна быть вычислена для каждого сравнения. (Это поведение, по-видимому, зависит от СУБД, YMMV).

MS SQL Server: (SQL Fiddle | db fiddle)

во-первых, используя дату

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)

дата:

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)

дата:

select * from dates 
where dte = current_date
;

использование метки времени без часового пояса:

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

Oracle: (SQL Fiddle)

дата:

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

Не уверен, что ваши вопросы!

SELECT  GETDATE()

даст вам текущую дату и время

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

вы получите только дату с временем, установленным на 00:00: 00

не уверен точно, что вы пытаетесь сделать, но это звучит как GETDATE() это то, что вам нужно. GETDATE() возвращает datetime, но если вы не заинтересованы в компоненте времени, то вы можете привести к дате.

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

просто обнулить элемент времени даты. например,

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

Я использовал GetDate, поскольку это функция MSSQL, как вы отметили, но теперь (), вероятно, 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

Я надеюсь, что это помогает.

EDIT:
После комментария @dwurf (Спасибо) о влиянии приведенного выше примера на производительность, я хотел бы предложить вместо этого следующее. Мы создаем диапазон дат между сегодняшним днем в полночь (начало дня) и последней миллисекундой дня (SQL server count up to .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 (так сегодня).

вы можете попробовать этот код SQL;

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

где created_date между CURRENT_TIMESTAMP-180 и CURRENT_TIMESTAMP

Comments

    Ничего не найдено.