Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с датами. / 25 сообщений из 58, страница 1 из 3
28.12.2018, 15:02
    #39754590
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
Всем привет, мне необходимо найти все цены на продкты и названия продуктов, но только тех 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
...
Рейтинг: 0 / 0
28.12.2018, 15:22
    #39754607
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
Самый правильный с т.з. поиска это пожалуй

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

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

where year(p.date)<>2017

зы: Любое преобразование в фильтре - потенциальные тормоза.
...
Рейтинг: 0 / 0
28.12.2018, 15:43
    #39754611
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
L_argoСамый правильный с т.з. поиска это пожалуй

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

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

where year(p.date)<>2017

зы: Любое преобразование в фильтре - потенциальные тормоза.Короче:
Код: sql
1.
where p.date < '2017' or p.date >= '2018'
...
Рейтинг: 0 / 0
28.12.2018, 15:52
    #39754615
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
с 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
...
Рейтинг: 0 / 0
28.12.2018, 16:33
    #39754632
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
L_argoзы: Любое преобразование в фильтре - потенциальные тормоза.
dermamaс DATEPART переделал
А в результате мартышка взяла гранату и выдернула чеку... Ну и зачем было так делать?
...
Рейтинг: 0 / 0
28.12.2018, 16:36
    #39754635
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
Руслан Дамирович,
Не совсем вас понял)
...
Рейтинг: 0 / 0
28.12.2018, 16:37
    #39754636
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
Руслан Дамирович,

Тоесть понял, смысл что с datepart будет более ресурсотребовательное, однако для меня важно лишь сделать различными способами, в плане понятия материала и обучения, вот)
...
Рейтинг: 0 / 0
28.12.2018, 16:56
    #39754645
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
dermamaРуслан Дамирович,

Тоесть понял, смысл что с datepart будет более ресурсотребовательное, однако для меня важно лишь сделать различными способами, в плане понятия материала и обучения, вот)
Смысл образования не только научить забивать гвозди, но при этом научить использовать для этого микроскопмолоток.
...
Рейтинг: 0 / 0
28.12.2018, 17:00
    #39754646
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
[quot Руслан Дамирович]dermamaРуслан Дамирович,


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

Вот поэтому начал изучать книгу сборник рецептов Энтони Молинаро.
...
Рейтинг: 0 / 0
28.12.2018, 17:10
    #39754650
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
dermamaВот поэтому начал изучать книгу сборник рецептов Энтони Молинаро.
Перепиши запрос, и больше не греши...
...
Рейтинг: 0 / 0
28.12.2018, 17:26
    #39754653
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
dermamaсборник рецептов Энтони Молинаро.Книга, в которой:
- таблицы в предложении FROM перечисляются через запятую
- даются примеры на вывод строк в определенном порядке без использования order by
- используется not in (select ...) вместо not exists(select ...)
На сборник тецептов не тянет. Совсем.
...
Рейтинг: 0 / 0
28.12.2018, 18:07
    #39754664
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
invmdermamaсборник рецептов Энтони Молинаро.Книга, в которой:
- таблицы в предложении FROM перечисляются через запятую
- даются примеры на вывод строк в определенном порядке без использования order by
- используется not in (select ...) вместо not exists(select ...)
На сборник тецептов не тянет. Совсем.

ничто не идеально, во всем есть огрехи) однако там 668 страниц. я уже знаю , что вы ответите примерно "достаточно увидеть, как он объясняет это , чтобы понять всю суть книги" , а я всеравно прочту и сделаю потом свой вывод)
...
Рейтинг: 0 / 0
28.12.2018, 18:22
    #39754670
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
dermama Тоесть понял, смысл что с datepart будет более ресурсотребовательноеНеправильно понял
...
Рейтинг: 0 / 0
28.12.2018, 18:28
    #39754672
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
SERG1257dermama Тоесть понял, смысл что с datepart будет более ресурсотребовательноеНеправильно понял

Можно объяснить?
...
Рейтинг: 0 / 0
28.12.2018, 18:33
    #39754675
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
dermama,

Код: sql
1.
2.
3.
4.
5.
6.
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 может быть месяц-число, а может быть число-месяц.

Делайте так

Код: sql
1.
2.
3.
4.
5.
6.
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 .
...
Рейтинг: 0 / 0
28.12.2018, 18:44
    #39754678
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
Делайте такЗачем так сложно, если можно явно указать p.date > '20170101' и оно не перепутается локальными настройками ?
...
Рейтинг: 0 / 0
28.12.2018, 18:59
    #39754681
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
dermama Можно объяснить?Проиндексируйте поле с датой.
Посмотрите планы для запросов с
where p.date < '2017' or p.date >= '2018'
и
DATEPART(year, p.date) <> 2017
...
Рейтинг: 0 / 0
28.12.2018, 19:00
    #39754682
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
L_argoДелайте такЗачем так сложно, если можно
Чтобы сформировать рефлекс. Чтобы делать кошерно на уровне автоматизма.
...
Рейтинг: 0 / 0
28.12.2018, 19:38
    #39754693
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
Andy_OLAPL_argoЗачем так сложно, если можно
Чтобы сформировать рефлекс. Чтобы делать кошерно на уровне автоматизма.Зачем неправильный рефлекс?
Правильный рефлекс - использовать литералы даты-времени в формате, который всегда однозначно распознаётся сервером, не зависит ни от каких натроек, и при этом короткий. То есть использовать сиквельный литерал дата-время, вида "ISO формат YYYYMMDD", без странных преобразований из целочисленного литерала.
...
Рейтинг: 0 / 0
28.12.2018, 19:41
    #39754695
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
dermamainvmпропущено...
Книга, в которой:
- таблицы в предложении FROM перечисляются через запятую
- даются примеры на вывод строк в определенном порядке без использования order by
- используется not in (select ...) вместо not exists(select ...)
На сборник тецептов не тянет. Совсем.

ничто не идеально, во всем есть огрехи) однако там 668 страниц. я уже знаю , что вы ответите примерно "достаточно увидеть, как он объясняет это , чтобы понять всю суть книги" , а я всеравно прочту и сделаю потом свой вывод)Читайте правильные книги.
Ицика Бен-Гана, например.
...
Рейтинг: 0 / 0
28.12.2018, 19:53
    #39754700
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
alexeyvgв формате, который всегда однозначно распознаётся сервером, не зависит ни от каких натроек
convert(datetime,...,112) всегда однозначно определяется сервером
alexeyvgи при этом короткий
Я не понимаю, откуда такая тяга у российских разработчиков. Однострочники perl, компактные выражения. Краткость - сестра таланта. Но мачеха гонорара. Вы же работаете с молодыми, Вы понимаете, кто идет на смену. Или составляете выражения так, чтобы индус, которого разбудили в полночь, понял спросонья, или получаете рано или поздно проблемы.

Не нужно коротко. Нужно понятно.
...
Рейтинг: 0 / 0
28.12.2018, 20:13
    #39754705
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
Andy_OLAPalexeyvgв формате, который всегда однозначно распознаётся сервером, не зависит ни от каких натроек
convert(datetime,...,112) всегда однозначно определяется сервером'20170101' тоже всегда однозначно распознаётся сервером.

Из тысяч однозначно определяемых сервером вариантов константы даты, которое можно написать, нужно использовать тот, который будет короткий, то есть понятный.
В документации есть страничка про типы, вот её и нужно использовать. Там вполне понятные литералы, и с компактной записью.
PS Я даже боюсь думать, сколько строк займут при таком подходе константы varchar или float :-)
...
Рейтинг: 0 / 0
28.12.2018, 20:49
    #39754709
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
Оспадя... Человек смотрит учится набивает шишки. А ему сразу заботливые мамы бабушки "шапку надень" "никогда так не делай" "качели на морозе не лижи"...

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

Тут имхо проблема в примерах, что они наверняка в том же вакууме и я лично не уверен, что к моменту объяснения операторов сравнения уже объяснены джойны. Иначе это вот войдёт в шаблон - выборка по фильтру с self join.
...
Рейтинг: 0 / 0
28.12.2018, 20:52
    #39754710
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
Упс, там не self join.
...
Рейтинг: 0 / 0
28.12.2018, 22:06
    #39754728
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с датами.
alexeyvgAndy_OLAPпропущено...

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

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

безусловно, YYYYMMDD как формат даты беспроигрышный
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с датами. / 25 сообщений из 58, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]