Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запрос на выборку за текущую дату в переменной where  [new]
tata72
Member

Откуда:
Сообщений: 7
Приветствую!
Необходимо выполнить запрос к ms sql 2000. В запросе сначала идет указание общей даты, затем уточнение времени через datepart. Каким образом можно выполнить запрос, чтобы бралась системная (текущая) дата?
...Where
t.datetime >='01.01.2001 00:00:00' and t.datetime <='01.01.2001 23:59:59' //эту строчку заменить на текущую дату с 00:00 до 23:59:00 
16 мар 17, 08:49    [20300337]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
tata72
t.datetime >='01.01.2001 00:00:00' and t.datetime <='01.01.2001 23:59:59' //эту строчку заменить на текущую дату с 00:00 до 23:59:00 

t.datetime >= convert(date, getdate()) and t.datetime < dateadd(dd, 1, convert(date, getdate()))
16 мар 17, 09:03    [20300365]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
tata72
Member

Откуда:
Сообщений: 7
alexeyvg, к сожалению ошибка "Type date is not a defined system type". Предположительно из-за версии sql сервера?
16 мар 17, 09:09    [20300383]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
iiyama
Member

Откуда:
Сообщений: 642
tata72,

convert(date, getdate()) -> convert(datetime, getdate()) ->
16 мар 17, 09:22    [20300429]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
iiyama
Member

Откуда:
Сообщений: 642
tata72,
сорри не прочитал полностью
set nocount on;
declare @d datetime;
set @d=getdate();
select 'Дата ', cast(convert(char(8),@d,112) as datetime);

FAQ
16 мар 17, 09:24    [20300435]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
tata72
Member

Откуда:
Сообщений: 7
iiyama, этот вариант не подходит, мне не встроить его в имеющийся запрос.
16 мар 17, 09:34    [20300469]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
iiyama
Member

Откуда:
Сообщений: 642
tata72,
а его и не надо встраивать, он показывает одни из способов как в 2k "отрезать" время от даты. Нужно переписать запрос Алексея, тк
convert(date, getdate()) в его запросе предназначено для этого
16 мар 17, 09:40    [20300490]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
tata72
Member

Откуда:
Сообщений: 7
iiyama, пустая страница...

t.datetime >= convert(datetime, getdate()) and t.datetime < dateadd(dd, 1, convert(datetime, getdate()))
16 мар 17, 09:57    [20300560]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
tata72,

не слушайте глупости, зачем вам datetime? если вам надо с 00:00 до 23:59:00
16 мар 17, 10:07    [20300619]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
tata72
Member

Откуда:
Сообщений: 7
Возможно таблица t.datetime путает и наводит на datetime.
Есть функция TO_DATE, но она работает только от 2005 sqlsrv.
16 мар 17, 10:15    [20300649]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
tata72
Возможно таблица t.datetime путает и наводит на datetime.
Есть функция TO_DATE, но она работает только от 2005 sqlsrv.
Нет такой функции в MSSQL 2005
Что-такое есть в Oracle, мне кажется. Не путаете?
16 мар 17, 10:19    [20300670]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
tata72
Member

Откуда:
Сообщений: 7
iap, все верно, просто DATE и от 2008 версии.
16 мар 17, 10:25    [20300697]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
tata72,

t.datetime >= DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) AND t.datetime < DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE()))
16 мар 17, 10:30    [20300727]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
iiyama
Member

Откуда:
Сообщений: 642
tata72,
вроде сегодня не пятница :)
0. ТС нужно получить диапазон от начала текущего дня, до его окончания
1. getdate() - возвращает текущую дату в формате datetime.
2. Алексей предложил ТС, преобразовать текущую дату/время в дату и отфильтровать данные между полученным значением и полученным значением+1 день
3. В 2k нет типа date, поэтому я предложил сделать это преобразование посредством двойного преобразования через строку

что не так?
16 мар 17, 10:33    [20300747]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iiyama,

cast(convert(char(8),@d,112) as datetime


это омерзительно
16 мар 17, 10:35    [20300754]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
TaPaK
iiyama,

cast(convert(char(8),@d,112) as datetime



это омерзительно
это нормально. Если вы про скобку, я согласен.
16 мар 17, 10:36    [20300768]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iap,

нет ничего нормального в ненужном преобразовании даты в символ и обратно
16 мар 17, 10:40    [20300788]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
TaPaK
iap,

нет ничего нормального в ненужном преобразовании даты в символ и обратно
А у вас преобразование в int (и не раз!) и обратно.
16 мар 17, 10:44    [20300820]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
tata72
Member

Откуда:
Сообщений: 7
TaPaK
tata72,

t.datetime >= DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) AND t.datetime < DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE()))


Я вам очень благодарен! Сейчас выводит весь массив "=> Array [t.datetime] => DateTime Object ( )" на сегодняшний день и из чего делаю выводы, что работает.
16 мар 17, 10:59    [20300943]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iap
TaPaK
iap,

нет ничего нормального в ненужном преобразовании даты в символ и обратно
А у вас преобразование в int (и не раз!) и обратно.


без злого умыслу, интересует нас только процессор в данном случае
SET NOCOUNT ON
CREATE TABLE #Time
(
	ID INT IDENTITY(1,1) PRIMARY KEY ,
	T DATETIME 
)

CREATE NONCLUSTERED INDEX ixT ON #Time (T)

INSERT INTO #Time (T)
SELECT a.create_date FROM sys.objects a,master..spt_values b

DECLARE @a INT

SET STATISTICS TIME ON

PRINT '----------------char'
SELECT @a = 1
FROM #Time
WHERE 
	T >= cast(convert(char(8),getdate(),112) as datetime) AND T < DATEADD(day,1,cast(convert(char(8),getdate(),112) as datetime))
OPTION (MAXDOP 1, RECOMPILE)

PRINT '----------------int'
SELECT @a = 1
FROM #Time
WHERE
	t >= DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) AND t < DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE()))
OPTION (MAXDOP 1, RECOMPILE)

PRINT '----------------'

SET STATISTICS TIME OFF
DROP TABLE #Time


и среднее по больнице у меня
+

----------------char

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 107 ms, elapsed time = 107 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 39 ms.
----------------int

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 35 ms.
----------------
16 мар 17, 11:02    [20300973]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
TaPaK,

Выражения в предикатах, из-за getdate(), будут вычисляться один раз на запрос, а не для каждой строки. Нужно примерно так:
PRINT '----------------char'
SELECT @a = 1
FROM #Time
WHERE 
	cast(convert(char(8),T,112) as datetime) = '17530101'
OPTION (MAXDOP 1)

PRINT '----------------int'
SELECT @a = 1
FROM #Time
WHERE
	DATEADD(dd, 0, DATEDIFF(dd, 0, T)) = '17530101'
OPTION (MAXDOP 1)

PRINT '----------------'
16 мар 17, 12:18    [20301378]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
TaPaK
iap,

нет ничего нормального в ненужном преобразовании даты в символ и обратно


Вы можете удивиться, насколько быстро это может работать.
16 мар 17, 13:23    [20301794]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Владислав Колосов
TaPaK
iap,

нет ничего нормального в ненужном преобразовании даты в символ и обратно


Вы можете удивиться, насколько быстро это может работать.

я не удивился, я пример привёл, можно даже с уточнением invm
16 мар 17, 13:24    [20301803]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Мне кажется, разница этих двух способов пренебрежимо мала.
Спорить бесполезно. Кстати, уже здесь спорили, и не раз!
16 мар 17, 13:27    [20301817]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку за текущую дату в переменной where  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Вот мой пример:
SET NOCOUNT ON


CREATE TABLE #Time
(
	ID INT IDENTITY(1,1) PRIMARY KEY ,
	T DATETIME 
);
CREATE TABLE #Time1
(
	ID INT IDENTITY(1,1) PRIMARY KEY ,
	T DATETIME 
);

SET STATISTICS TIME ON;
insert #time (T) 
	select convert(char(10), getdate(), 112) from master.dbo.spt_values t1, master.dbo.spt_values t2	;


insert #Time1 (T) 
	select DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) from master.dbo.spt_values t1, master.dbo.spt_values t2	;
/*
Время синтаксического анализа и компиляции SQL Server: 
 время ЦП = 0 мс, истекшее время = 1 мс.

 Время работы SQL Server:
   Время ЦП = 2776 мс, затраченное время = 2586 мс.
Время синтаксического анализа и компиляции SQL Server: 
 время ЦП = 0 мс, истекшее время = 1 мс.

 Время работы SQL Server:
   Время ЦП = 2934 мс, затраченное время = 3012 мс.
*/
SET STATISTICS TIME OFF;
16 мар 17, 13:35    [20301869]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить