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

Откуда:
Сообщений: 222
Всем привет, мне необходимо найти все цены на продкты и названия продуктов, но только тех Date которых не равна 2017 году.

сделал пару вариантов

SELECT p.price, g.mark
FROM price p
INNER JOIN
goods g
ON p.gID = g.gID
WHERE p.date <> '2017-06-01';
GO



SELECT p.price, g.mark
FROM price p
INNER JOIN
goods g
ON p.gID = g.gID
WHERE p.date NOT BETWEEN '2017-01-01' AND '2017-12-31';
GO


-- не стал джойнить тут,
SELECT price
FROM price
EXCEPT SELECT price FROM price
WHERE date BETWEEN '2017-01-01' AND '2017-12-31';
GO


есть еще вариант с datepart

SELECT p.price, g.mark
FROM price p
INNER JOIN
goods g
ON p.gID = g.gID
WHERE p.date <> CAST(DATEPART(year, '2017-01-01') as varchar(20));

однако последний вариант выводит мне все значения, в том числе и те, которые мне не нужны


Как еще можно найти цены на товары если мне допустим нужны все даты кроме 2017 года...
САМИ таблицы

CREATE TABLE goods
(
gID INT,
mark varchar(20),
estdate DATE,
CONSTRAINT PK_gID PRIMARY KEY (gID)
);
GO

CREATE TABLE Price
(
pID INT,
price INT,
gID INT,
date DATE,
CONSTRAINT PK_pID PRIMARY KEY(pID)
);
GO

INSERT INTO goods
VALUES
(1, 'skies', '2008-01-01'),
(2, 'skies', '2007-01-01'),
(3, 'ball', '2007-01-01');
GO

INSERT INTO price
VALUES
(1, 10, 3, '2018-01-01'),
(2, 20, 3, '2019-01-01'),
(3, 9, 3, '2017-06-01'),
(4, 25, 1, '2018-11-01');
GO
28 дек 18, 15:02    [21775821]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
L_argo
Member

Откуда:
Сообщений: 1135
Самый правильный с т.з. поиска это пожалуй

where (p.date < '20170101' or p.date >= '20180101')

А самый лаконичный, но при этом медленный

where year(p.date)<>2017

зы: Любое преобразование в фильтре - потенциальные тормоза.
28 дек 18, 15:22    [21775852]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
L_argo
Самый правильный с т.з. поиска это пожалуй

where (p.date < '20170101' or p.date >= '20180101')

А самый лаконичный, но при этом медленный

where year(p.date)<>2017

зы: Любое преобразование в фильтре - потенциальные тормоза.
Короче:
where p.date < '2017' or p.date >= '2018'
28 дек 18, 15:43    [21775871]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
dermama
Member

Откуда:
Сообщений: 222
с DATEPART переделал


SELECT p.price, g.mark
FROM price p
INNER JOIN
goods g
ON p.gID = g.gID
WHERE DATEPART(year, p.date) <> 2017;
GO
28 дек 18, 15:52    [21775883]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
L_argo
зы: Любое преобразование в фильтре - потенциальные тормоза.

dermama
с DATEPART переделал

А в результате мартышка взяла гранату и выдернула чеку... Ну и зачем было так делать?
28 дек 18, 16:33    [21775922]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
dermama
Member

Откуда:
Сообщений: 222
Руслан Дамирович,
Не совсем вас понял)
28 дек 18, 16:36    [21775926]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
dermama
Member

Откуда:
Сообщений: 222
Руслан Дамирович,

Тоесть понял, смысл что с datepart будет более ресурсотребовательное, однако для меня важно лишь сделать различными способами, в плане понятия материала и обучения, вот)
28 дек 18, 16:37    [21775928]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
dermama
Руслан Дамирович,

Тоесть понял, смысл что с datepart будет более ресурсотребовательное, однако для меня важно лишь сделать различными способами, в плане понятия материала и обучения, вот)

Смысл образования не только научить забивать гвозди, но при этом научить использовать для этого микроскопмолоток.
28 дек 18, 16:56    [21775951]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
dermama
Member

Откуда:
Сообщений: 222
[quot Руслан Дамирович]
dermama
Руслан Дамирович,


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


Вот поэтому начал изучать книгу сборник рецептов Энтони Молинаро.
28 дек 18, 17:00    [21775954]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
dermama
Вот поэтому начал изучать книгу сборник рецептов Энтони Молинаро.

Перепиши запрос, и больше не греши...
28 дек 18, 17:10    [21775958]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
invm
Member

Откуда: Москва
Сообщений: 9118
dermama
сборник рецептов Энтони Молинаро.
Книга, в которой:
- таблицы в предложении FROM перечисляются через запятую
- даются примеры на вывод строк в определенном порядке без использования order by
- используется not in (select ...) вместо not exists(select ...)
На сборник тецептов не тянет. Совсем.
28 дек 18, 17:26    [21775964]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
dermama
Member

Откуда:
Сообщений: 222
invm
dermama
сборник рецептов Энтони Молинаро.
Книга, в которой:
- таблицы в предложении FROM перечисляются через запятую
- даются примеры на вывод строк в определенном порядке без использования order by
- используется not in (select ...) вместо not exists(select ...)
На сборник тецептов не тянет. Совсем.


ничто не идеально, во всем есть огрехи) однако там 668 страниц. я уже знаю , что вы ответите примерно "достаточно увидеть, как он объясняет это , чтобы понять всю суть книги" , а я всеравно прочту и сделаю потом свой вывод)
28 дек 18, 18:07    [21775981]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
SERG1257
Member

Откуда:
Сообщений: 2684
dermama
Тоесть понял, смысл что с datepart будет более ресурсотребовательное
Неправильно понял
28 дек 18, 18:22    [21775989]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
dermama
Member

Откуда:
Сообщений: 222
SERG1257
dermama
Тоесть понял, смысл что с datepart будет более ресурсотребовательное
Неправильно понял


Можно объяснить?
28 дек 18, 18:28    [21775992]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
dermama,

SELECT p.price, g.mark
FROM price p
INNER JOIN
goods g
ON p.gID = g.gID
WHERE p.date NOT BETWEEN '2017-01-01' AND '2017-12-31';

Никогда так не делайте. Потому что 12-31 может быть месяц-число, а может быть число-месяц.

Делайте так

SELECT p.price, g.mark
FROM price p
INNER JOIN
goods g
ON p.gID = g.gID
WHERE p.date < convert(datetime,convert(varchar(8),20170101),112) or p.date >= convert(datetime,convert(varchar(8),20180101),112)


Потому что 112 - это ISO формат YYYYMMDD.
28 дек 18, 18:33    [21775999]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
L_argo
Member

Откуда:
Сообщений: 1135
Делайте так
Зачем так сложно, если можно явно указать p.date > '20170101' и оно не перепутается локальными настройками ?
28 дек 18, 18:44    [21776004]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
SERG1257
Member

Откуда:
Сообщений: 2684
dermama
Можно объяснить?
Проиндексируйте поле с датой.
Посмотрите планы для запросов с
where p.date < '2017' or p.date >= '2018'
и
DATEPART(year, p.date) <> 2017
28 дек 18, 18:59    [21776010]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
L_argo
Делайте так
Зачем так сложно, если можно

Чтобы сформировать рефлекс. Чтобы делать кошерно на уровне автоматизма.
28 дек 18, 19:00    [21776011]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30753
Andy_OLAP
L_argo
Зачем так сложно, если можно

Чтобы сформировать рефлекс. Чтобы делать кошерно на уровне автоматизма.
Зачем неправильный рефлекс?
Правильный рефлекс - использовать литералы даты-времени в формате, который всегда однозначно распознаётся сервером, не зависит ни от каких натроек, и при этом короткий. То есть использовать сиквельный литерал дата-время, вида "ISO формат YYYYMMDD", без странных преобразований из целочисленного литерала.
28 дек 18, 19:38    [21776027]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
dermama
invm
пропущено...
Книга, в которой:
- таблицы в предложении FROM перечисляются через запятую
- даются примеры на вывод строк в определенном порядке без использования order by
- используется not in (select ...) вместо not exists(select ...)
На сборник тецептов не тянет. Совсем.


ничто не идеально, во всем есть огрехи) однако там 668 страниц. я уже знаю , что вы ответите примерно "достаточно увидеть, как он объясняет это , чтобы понять всю суть книги" , а я всеравно прочту и сделаю потом свой вывод)
Читайте правильные книги.
Ицика Бен-Гана, например.
28 дек 18, 19:41    [21776029]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
alexeyvg
в формате, который всегда однозначно распознаётся сервером, не зависит ни от каких натроек

convert(datetime,...,112) всегда однозначно определяется сервером
alexeyvg
и при этом короткий

Я не понимаю, откуда такая тяга у российских разработчиков. Однострочники perl, компактные выражения. Краткость - сестра таланта. Но мачеха гонорара. Вы же работаете с молодыми, Вы понимаете, кто идет на смену. Или составляете выражения так, чтобы индус, которого разбудили в полночь, понял спросонья, или получаете рано или поздно проблемы.

Не нужно коротко. Нужно понятно.
28 дек 18, 19:53    [21776034]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30753
Andy_OLAP
alexeyvg
в формате, который всегда однозначно распознаётся сервером, не зависит ни от каких натроек

convert(datetime,...,112) всегда однозначно определяется сервером
'20170101' тоже всегда однозначно распознаётся сервером.

Из тысяч однозначно определяемых сервером вариантов константы даты, которое можно написать, нужно использовать тот, который будет короткий, то есть понятный.
В документации есть страничка про типы, вот её и нужно использовать. Там вполне понятные литералы, и с компактной записью.
PS Я даже боюсь думать, сколько строк займут при таком подходе константы varchar или float :-)
28 дек 18, 20:13    [21776041]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
Оспадя... Человек смотрит учится набивает шишки. А ему сразу заботливые мамы бабушки "шапку надень" "никогда так не делай" "качели на морозе не лижи"...

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

Тут имхо проблема в примерах, что они наверняка в том же вакууме и я лично не уверен, что к моменту объяснения операторов сравнения уже объяснены джойны. Иначе это вот войдёт в шаблон - выборка по фильтру с self join.
28 дек 18, 20:49    [21776052]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
Упс, там не self join.
28 дек 18, 20:52    [21776053]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с датами.  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5162
alexeyvg
Andy_OLAP
пропущено...

convert(datetime,...,112) всегда однозначно определяется сервером
'20170101' тоже всегда однозначно распознаётся сервером.

справедливости ради, в данном случае будет неявное преобразование типов в случае сравнения с датой

безусловно, YYYYMMDD как формат даты беспроигрышный
28 дек 18, 22:06    [21776082]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить