Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

В 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 2008, существует дата даты DATE, которая имеет только дату, а не время:

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

Ответ 2

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

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

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

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

MS SQL Server: (скрипта SQL | db & lt;> скрипка)

Во-первых, используя 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 & lt;> 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 & lt;> fiddle)

Используя ДАТУ:

select * from dates 
where dte = current_date
;

Использование TIMESTAMP без временной зоны:

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
;

Использование 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

Ответ 3

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

Однако

SELECT  GETDATE()

Вы получите текущую дату и время

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

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

Ответ 4

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

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

Ответ 5

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

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

Я использовал GetDate как функцию MSSQL, как вы отметили, но Now(), вероятно, MySQL, или вы используете вызов функции ODBC, все равно должно работать, если вы просто замените одну на другую.

Ответ 6

Основываясь на предыдущих ответах, обратите внимание на важный момент, вам также нужно управлять столбцом таблицы, чтобы гарантировать, что он не содержит временного фрагмента типа данных datetime.

Ниже представлен небольшой пример script, демонстрирующий выше:

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-серверов достигает 0,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

Ответ 7

Если у вас есть таблица только с сохраненной датой (нет времени) и вы хотите получить ее по "сейчас", вы можете сделать это:

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

Это приводит к строкам, разница в которых равна 0 (так сегодня).

Ответ 8

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

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

Ответ 9

Вы можете попробовать:

WHERE created_date BETWEEN CURRENT_TIMESTAMP-180 AND CURRENT_TIMESTAMP

Ответ 10

Это сработало для меня:

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