В sql 2005 вместо создания запроса из dateparts год, месяц и дата,
есть ли более сжатый способ написания предложения where?
В sql 2005 вместо создания запроса из dateparts год, месяц и дата,
есть ли более сжатый способ написания предложения where?
В 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))
Хорошо, что много информации сразу! Надеюсь, что все это имеет смысл:)
В 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))
Не хорошая производительность, но решение:
SELECT *
FROM tblDate
WHERE CONVERT(VARCHAR, date, 112) = CONVERT(VARCHAR, GETDATE(), 112);
Если это общий запрос, то вычисленный столбец должен быть добавлен только с содержимым года-месяца.
Что-то по строкам этого
CONVERT(date,tbldata.date)=CONVERT(date,getdate())
Это предполагает, что столбец даты также включает время. Если это не так, вы можете изменить его на
tbldata.date=CONVERT(date,getdate())
Я использовал 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()).