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')) ;
Не уверен, что ваши вопросы!
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')
Comments