Получите строку где столбец даты и времени = сегодня - новичок SQL-сервера

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

существует ли более сжатый способ записать где пункт?

37
задан Kiquenet 31 December 2013 в 11:25
поделиться

5 ответов

В 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))

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

24
ответ дан 27 November 2019 в 04:48
поделиться

Я использовал 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 ()).

0
ответ дан 27 November 2019 в 04:48
поделиться

Что-то вроде этого

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

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

tbldata.date=CONVERT(date,getdate())
1
ответ дан 27 November 2019 в 04:48
поделиться

В 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))
29
ответ дан 27 November 2019 в 04:48
поделиться

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

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

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

4
ответ дан 27 November 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: