В sql 2005, вместо того, чтобы создать запрос с dateparts года, месяца и даты,
существует ли более сжатый способ записать где пункт?
В SQL 2000 и SQL 2005 вы можете использовать красивую инструкцию 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)
Edit: Изменено в соответствии с требованиями, обратите внимание на 1 во втором DateAdd (это добавляет количество дней, прошедших с начала, к 1 (вместо 0), что делает это 7 апреля 2010 г., 00:00:00) Если вы хотите, чтобы 6 апреля 23:59:59 вы отделили секунду от второго свидания
DATEADD(ss,-1,'My DateTime')
Final Call превратился бы в
DATEADD(ss,-1,DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 1))
Хорошо, это много информации на однажды! Надеюсь, все это имеет смысл :)
Я использовал 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 ()).
Что-то вроде этого
CONVERT(date,tbldata.date)=CONVERT(date,getdate())
Предполагается, что столбец даты также включает время. Если это не так, вы можете изменить его на
tbldata.date=CONVERT(date,getdate())
В 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)
преобразует текущую дату и время в значение только для даты, например верните '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);
Если это обычный запрос, следует добавить вычисляемый столбец с содержанием только год-месяц-день.