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

Получить строку, где datetime column = today - сервер SQL noob

В sql 2005 вместо создания запроса из dateparts год, месяц и дата,

есть ли более сжатый способ написания предложения where?

4b9b3361

Ответ 1

В SQL 2000 и SQL 2005 вы можете использовать команду nice select для удаления компонента времени из DateTime, то есть

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

вернется 6 апреля 2010 года (ну на сегодня только).

В сочетании с ответом marc_s вам нужно

SELECT (list of fields)
FROM dbo.YourTable
WHERE dateValue BETWEEN DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 0) 
AND DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 1)

Изменить: изменено в соответствии с требованиями, обратите внимание на 1 во второй DateAdd (это добавляет дни, которые были от начала до 1 (вместо 0), делая это 7 апреля 2010 00:00:00) Если вы хотите, чтобы 6 апреля 23:59:59 вы уделили второе место со второй даты

DATEADD(ss,-1,'My DateTime')

Окончательный вызов станет

DATEADD(ss,-1,DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 1))

Хорошо, что много информации сразу! Надеюсь, что все это имеет смысл:)

Ответ 2

В SQL Server 2008 у вас будет новый тип данных DATE, который вы могли бы использовать для этого:

SELECT (list of fields)
FROM dbo.YourTable
WHERE dateValue BETWEEN 
   CAST(GETDATE() AS DATE) AND DATEADD(DAY, 1, CAST(GETDATE() AS DATE))

CAST(GETDATE() AS DATE) передает текущую дату и время в значение только для даты, например. return '2010-04-06' за 6 апреля 2010 года. Добавление одного дня к этому в основном выбирает все значения datetime сегодня.

В SQL Server 2005 нет простого способа сделать это - самое изящное решение которое я нашел здесь, использует числовые манипуляции с DATETIME добиться того же результата:

SELECT (list of fields)
FROM dbo.YourTable
WHERE dateValue BETWEEN 
   CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME) AND 
   DATEADD(DAY, 1, CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME))

Ответ 3

Не хорошая производительность, но решение:

SELECT * 
FROM tblDate
WHERE CONVERT(VARCHAR, date, 112) = CONVERT(VARCHAR, GETDATE(), 112);

Если это общий запрос, то вычисленный столбец должен быть добавлен только с содержимым года-месяца.

Ответ 4

Что-то по строкам этого

CONVERT(date,tbldata.date)=CONVERT(date,getdate())

Это предполагает, что столбец даты также включает время. Если это не так, вы можете изменить его на

tbldata.date=CONVERT(date,getdate())

Ответ 5

Я использовал UDF для этого в столбцах datetime, возвращающихся к SQL 2000.

CREATE FUNCTION [dbo].[GETDATENOTIME](@now datetime)
RETURNS smalldatetime
AS
BEGIN
    RETURN (CONVERT(smalldatetime, CONVERT(varchar, @now, 112)))
END

Использование:

DECLARE @date smalldatetime
SET @date = '4/1/10'
SELECT * FROM mytable WHERE dbo.GETDATENOTIME(date) = @date

Не самая эффективная вещь в мире (YMMV в зависимости от вашей таблицы), но она выполняет эту работу. Для таблиц, где я знаю, я буду выбирать на основе даты без времени, у меня будет столбец специально для него с настройкой по умолчанию для dbo.GETDATENOTIME(GETDATE()).