powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с датами.
58 сообщений из 58, показаны все 3 страниц
Проблема с датами.
    #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
Проблема с датами.
    #39754607
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый правильный с т.з. поиска это пожалуй

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

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

where year(p.date)<>2017

зы: Любое преобразование в фильтре - потенциальные тормоза.
...
Рейтинг: 0 / 0
Проблема с датами.
    #39754611
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
Проблема с датами.
    #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
Проблема с датами.
    #39754632
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argoзы: Любое преобразование в фильтре - потенциальные тормоза.
dermamaс DATEPART переделал
А в результате мартышка взяла гранату и выдернула чеку... Ну и зачем было так делать?
...
Рейтинг: 0 / 0
Проблема с датами.
    #39754635
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руслан Дамирович,
Не совсем вас понял)
...
Рейтинг: 0 / 0
Проблема с датами.
    #39754636
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руслан Дамирович,

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

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


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

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

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

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

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

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

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

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

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

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

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

безусловно, YYYYMMDD как формат даты беспроигрышный
...
Рейтинг: 0 / 0
Проблема с датами.
    #39754761
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komradalexeyvg '20170101' тоже всегда однозначно распознаётся сервером.

справедливости ради, в данном случае будет неявное преобразование типов в случае сравнения с датойДа, сиквел хранит как строку, и делает преобразование, так что я погорячился насчёт "константы типа дата".
...
Рейтинг: 0 / 0
Проблема с датами.
    #39754791
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPalexeyvgв формате, который всегда однозначно распознаётся сервером, не зависит ни от каких натроек
convert(datetime,...,112) всегда однозначно определяется сервером
alexeyvgи при этом короткий
Я не понимаю, откуда такая тяга у российских разработчиков. Однострочники perl, компактные выражения. Краткость - сестра таланта. Но мачеха гонорара. Вы же работаете с молодыми, Вы понимаете, кто идет на смену. Или составляете выражения так, чтобы индус, которого разбудили в полночь, понял спросонья, или получаете рано или поздно проблемы.

Не нужно коротко. Нужно понятно.

единственное, что понятно в предложенном вами варианте - это то, что у вас что то с головой.
если преобразование к datetime еще можно хоть как то объяснить с точки зрения отказа от неявных преобразований типов, то конвертация числовой константы в строку может быть оправдана только одним - побуквенной оплатой.
никакой понятности и потребности в этом нет.
...
Рейтинг: 0 / 0
Проблема с датами.
    #39754813
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посетитель...
Да ладно вам ругаться, я вон до сих пор в ORACLE вижу, как пишут TO_DATE('2019/01/01', 'YYYY/MM/DD'), хотя можно просто D'2019-01-01' или DATE'2019-01-01'.
Ну привык он так, в WHERE не смертельно. Вот в SELECT INT -> VARCHAR -> VARCHAR(30) -> DATE может сожрать ему чуть больше памяти. Подумаешь, сервер же не железный - прожует, ну разве что оптимизатор поругается немного...
...
Рейтинг: 0 / 0
Проблема с датами.
    #39754821
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В прежних версиях TSQL была хорошая статья, а теперь вроде и не с стало её...
Использование данных даты и времени
...
Рейтинг: 0 / 0
Проблема с датами.
    #39754826
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан ДамировичПосетитель...
Да ладно вам ругаться, я вон до сих пор в ORACLE вижу, как пишут TO_DATE('2019/01/01', 'YYYY/MM/DD'), хотя можно просто D'2019-01-01' или DATE'2019-01-01'.
Ну привык он так, в WHERE не смертельно. Вот в SELECT INT -> VARCHAR -> VARCHAR(30) -> DATE может сожрать ему чуть больше памяти. Подумаешь, сервер же не железный - прожует, ну разве что оптимизатор поругается немного...

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

но человек же идет с этим в массы и заявляет, что именно так - правильно и понятно. А остальное - это типа блажь "российских разработчиков"
...
Рейтинг: 0 / 0
Проблема с датами.
    #39754831
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посетитель,

Не кормите "эксперта", не стоит становиться подопытным кроликом - он специально провоцирует реакцию.
Вот тут озвучены его истинные цели - 21420390 (два последних абзаца)
...
Рейтинг: 0 / 0
Проблема с датами.
    #39754839
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmПосетитель,

Не кормите "эксперта", не стоит становиться подопытным кроликом - он специально провоцирует реакцию.
Вот тут озвучены его истинные цели - 21420390 (два последних абзаца)
Так он икспердов с масквы не любит, мы-то тут при чем?
...
Рейтинг: 0 / 0
Проблема с датами.
    #39754975
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан ДамировичДа ладно вам ругаться, я вон до сих пор в ORACLE вижу, как пишут TO_DATE('2019/01/01', 'YYYY/MM/DD'), хотя можно просто D'2019-01-01' или DATE'2019-01-01'.
Ну привык он так, в WHERE не смертельноИспользование CONVERT в общем объяснимо - привычка всегда видеть название типа ещё хоть как то разумна, хотя и спорна (кто то скажет - избыточна). Но преобразование из числа??? Это уж точно абсурд.
...
Рейтинг: 0 / 0
Проблема с датами.
    #39755103
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан ДамировичinvmПосетитель,

Не кормите "эксперта", не стоит становиться подопытным кроликом - он специально провоцирует реакцию.
Вот тут озвучены его истинные цели - 21420390 (два последних абзаца)
Так он икспердов с масквы не любит, мы-то тут при чем?
Да не только. Еще не нравятся индусы из CenturyLink, которые соревнуются, кто быстрее минут за 20 внесет изменения в BGP. Ну просто таки зла не хватает. Впрочем, это все лирика.
...
Рейтинг: 0 / 0
Проблема с датами.
    #39755104
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПосетительРуслан Дамировичпропущено...

Да ладно вам ругаться, я вон до сих пор в ORACLE вижу, как пишут TO_DATE('2019/01/01', 'YYYY/MM/DD'), хотя можно просто D'2019-01-01' или DATE'2019-01-01'.
Ну привык он так, в WHERE не смертельно. Вот в SELECT INT -> VARCHAR -> VARCHAR(30) -> DATE может сожрать ему чуть больше памяти. Подумаешь, сервер же не железный - прожует, ну разве что оптимизатор поругается немного...

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

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

Итак. Почему именно convert(datetime,convert(varchar(8),20170101),112), а не просто convert(datetime,'20170101',112). Почему нужно бить палкой по голове и заставлять писать длинные преобразования.

А вот почему. Иногда нужно сделать так. declare @str nvarchar(MAX)
@str = N'select .......from ...... where date >= convert(datetime,convert(varchar(8),20170101),112)'
exec(@str)

И тут оказывается, что проще сделать так, чем следить, чтобы кавычки были внесены в двойном объеме.

Но даже не это главное. Иногда нужно сделать так:
Код: sql
1.
2.
3.
4.
5.
declare @str nvarchar(MAX)
declare @int1 int
set @int1 = 20170101
set @str = convert(nvarchar(MAX),'select ... from ... where date >= convert(datetime,convert(varchar(8),') + convert(nvarchar(MAX),@int1) + convert(nvarchar(MAX),'),112)')
exec(@str)



Зачем "бить по голове" и заставлять молодежь делать явный " convert(nvarchar(MAX),' " - оставляю за кадром. Пусть каждый думает в меру своей испорченности.
...
Рейтинг: 0 / 0
Проблема с датами.
    #39755105
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgРуслан ДамировичДа ладно вам ругаться, я вон до сих пор в ORACLE вижу, как пишут TO_DATE('2019/01/01', 'YYYY/MM/DD'), хотя можно просто D'2019-01-01' или DATE'2019-01-01'.
Ну привык он так, в WHERE не смертельноИспользование CONVERT в общем объяснимо - привычка всегда видеть название типа ещё хоть как то разумна, хотя и спорна (кто то скажет - избыточна). Но преобразование из числа??? Это уж точно абсурд.
Потому что нужно приучать использовать явную конвертацию и писать длинно, но понятно. И на первом этапе нужно просто заставлять. Потом это будет на уровне автоматизма. И никаких посыпаний головы пеплом и криков "ой-вей, нельзя ли записать все это покороче".
...
Рейтинг: 0 / 0
Проблема с датами.
    #39755106
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPset @str = convert(nvarchar(MAX),'select ... from ... where date >=
...
Зачем "бить по голове" и заставлять молодежь делать явный " convert(nvarchar(MAX),' " - оставляю за кадром. Пусть каждый думает в меру своей испорченности.
И вообще можно заставить делать так. Тоже для педагогического эффекта.
Код: sql
1.
set @str = convert(nvarchar(MAX),N'select ...
...
Рейтинг: 0 / 0
Проблема с датами.
    #39755117
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPalexeyvgИспользование CONVERT в общем объяснимо - привычка всегда видеть название типа ещё хоть как то разумна, хотя и спорна (кто то скажет - избыточна). Но преобразование из числа??? Это уж точно абсурд.
Потому что нужно приучать использовать явную конвертацию и писать длинно, но понятно.Преобразовать из числа - это "длинно, но понятно"?
Нужно было ещё несколько арифметических действий сделать, для лучшения конструкции. Типа
Код: sql
1.
convert(datetime,convert(varchar(8),(40340205-3)/2),112)


Это, я думаю, уже ближе к идеалу. Это ещё вдвое повысит профит бизнеса от проекта, и вашу ценность как сертифицированного пастуха стада баранов руководителя команды разработчиков :-)
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765151
Юлик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня суток. Хоть и работаю прогером много лет,но суть такая..у нас на предприятии используется ERP система+запросы на MS SQL. Вообще ,задача простая , есть 2 даты ремонта,где дата начала и дата конца,но дата начала может быть в этом году,а окончиться ремонт в следующем или через следующий и надо найти все ремонты,скажем ,за этот год который проводились или проводятся до сих пор с прошлого года . Т.е
Код: sql
1.
data_begin='20181010' data_end='20200515' 

Код: sql
1.
data_begin='20190101' data_end='20190931'

Код: sql
1.
data_begin='20191109' data_end='20191231'

надо найти все записи,которые включают,нынешний год? По простому ,я думаю так и всё ок...
Код: sql
1.
select * from rem where year(getdate()) between year(data_begin) and year(data_end)

Но суть в том,что наш "оптимизатор" с отдела,говорит,что не комильфо по оптимизации использовать "year",что надо брать начало нынешнего года ,конец нынешнего года и сравнивать эти две даты с "data_begin" и "data_end". Думаю..думаю,но не могу понять..зачем вообще такой геморрой надо делать? А чел при установке релиза будет проверять,думаю.Посоветуйте( возможно,надо как то брать "01.01.2019" и сравнивать с "data_begin" и "data_end",а потом брать "31.12.2019" с тоже сравнивать с "data_begin" и "data_end") . Посоветуйте с кодом..
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765158
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЮликНо суть в том,что наш "оптимизатор" с отдела,говорит,что не комильфо по оптимизации использовать "year",что надо брать начало нынешнего года ,конец нынешнего года и сравнивать эти две даты с "data_begin" и "data_end". Думаю..думаю,но не могу понять..зачем вообще такой геморрой надо делать?Правильно говорит, это выглядит отвратительно :-(
Как складывать числа, преобразовав их в картинки и попросив Гугл сложить.
ЮликПосоветуйте( возможно,надо как то брать "01.01.2019" и сравнивать с "data_begin" и "data_end",а потом брать "31.12.2019" с тоже сравнивать с "data_begin" и "data_end") . Посоветуйте с кодом..
Код: sql
1.
2.
3.
4.
select * 
from rem 
where getdate() >= convert(date, str(year(@data_begin)) + '0101') 
	and getdate() < dateadd(yy, 1, convert(date, str(year(@data_end) + '0101')))
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765166
Юлик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgЮликПосоветуйте( возможно,надо как то брать "01.01.2019" и сравнивать с "data_begin" и "data_end",а потом брать "31.12.2019" с тоже сравнивать с "data_begin" и "data_end") . Посоветуйте с кодом..
Код: sql
1.
2.
3.
4.
select * 
from rem 
where getdate() >= convert(date, str(year(@data_begin)) + '0101') 
	and getdate() < dateadd(yy, 1, convert(date, str(year(@data_end) + '0101')))


хм.. я понимаю,что придется конверт или каст использовать,но..это гемор,для того,что бы просто вывести данные,которые входят в диапазон нынешнего года.P.S не пойму,зачем надо конвертировать дату в варчар и делать такое... если тип данных везде "date"
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765168
Юлик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Юликalexeyvgпропущено...

Код: sql
1.
2.
3.
4.
select * 
from rem 
where getdate() >= convert(date, str(year(@data_begin)) + '0101') 
	and getdate() < dateadd(yy, 1, convert(date, str(year(@data_end) + '0101')))


хм.. я понимаю,что придется конверт или каст использовать,но..это гемор,для того,что бы просто вывести данные,которые входят в диапазон нынешнего года.P.S не пойму,зачем надо конвертировать дату в варчар и делать такое... если тип данных везде "date" ? или ,по ходу надо уже везде всё в варчар вести? P.S то,что я предложил,я не проверял,это так.. на бумаге,а в реале может выйти другое. Посоветуйте правильно решение найти входящие в диапазон нынешнего года P.S конечно,если это такой запрос для моей задачи..это жесть
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765169
Юлик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЮликЮликпропущено...

хм.. я понимаю,что придется конверт или каст использовать,но..это гемор,для того,что бы просто вывести данные,которые входят в диапазон нынешнего года.P.S не пойму,зачем надо конвертировать дату в варчар и делать такое... если тип данных везде "date" ? или ,по ходу надо уже везде всё в варчар вести? P.S то,что я предложил,я не проверял,это так.. на бумаге,а в реале может выйти другое. Посоветуйте правильно решение найти входящие в диапазон нынешнего года P.S конечно,если это такой запрос для моей задачи..это жесть P.P.S интересно,по планам запроса в SSMS это как будет выглядеть? не думаю,что быстрее будет с преобразованиями
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765171
Юлик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Юликalexeyvgпропущено...

Код: sql
1.
2.
3.
4.
select * 
from rem 
where getdate() >= convert(date, str(year(@data_begin)) + '0101') 
	and getdate() < dateadd(yy, 1, convert(date, str(year(@data_end) + '0101')))



спасибо,проверю по свободке,так как это сейчас на "горит",но,реальный дебилизм преобразовывать,так как по плану запросов сервак сделает по своему. P.S не проверял еще все варианты(которые сам думал),просто другие "задачи" по другим задачам не в этой сфере поставлены,а так,просто, интересовался...
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765176
Юлик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Юлик,

но , всё же.. то,что я привёл сам в раздумье,это не значит,что это правильно. Задача простая,есть ,скажем,нынешний год и надо вывести все ремонты,которые попадают в этот период ( а период может быть любой,но,когда дата окончания меньше чем нынешний год) .
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765182
Юлик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЮликЮлик,

но , всё же.. то,что я привёл сам в раздумье(когда начало года сравнивается с.. и т.д),это не значит,что это правильно. P.S понятно,что дело надо с конвертами и кастами,но а на план запросов ,думаю,это тоже повлияет? Или,как вы считаете?.
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765190
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dermama
Код: sql
1.
WHERE p.date <> CAST(DATEPART(year, '2017-01-01') as varchar(20));



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


То есть у вас в таблице дата в виде date eg 2017-01-01
Вы берете целевую дату в формате строки '2017-01-01', вставляете ее в datepart, где происходит неявное преобразование строки в дату и выделение года.
Полученный от datepart год вы опять же преобразуете в строку, причем длиной 20 символов.
И вот эту строку ('2017') теперь сравниваете с date в таблице, которая хранится как 2017-01-01 и при сравнении неявно преобразуется в строку '2017-01-01'

Очевидно строка 2017 не равна строке 2017-хх-хх никогда.
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765191
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wow это тут уже новую тему накидали в кучу
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765206
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юликно..это гемор,для того,что бы просто вывести данные,которые входят в диапазон нынешнего года.Вывести данные, которые входят в диапазон нынешнего года, можно и по другому.

Тут главное, что бы сервер смог воспользоваться зараннее сохранённым деревом диапазонов значений (то есть индексом) для быстрого поиска

ЮликP.S не пойму,зачем надо конвертировать дату в варчар и делать такое... если тип данных везде "date"Не обязательно в varchar
Просто один из вариантов выделения года, для ваших полей и условий.

А, у вас же data_begin и data_end - это поля?

Тогда да, неправильно.

Юликно , всё же.. то,что я привёл сам в раздумье,это не значит,что это правильно. Задача простая,есть ,скажем,нынешний год и надо вывести все ремонты,которые попадают в этот период ( а период может быть любой,но,когда дата окончания меньше чем нынешний год) .
А дата начала тут важна, или как?
"дата окончания меньше чем нынешний год" - то есть дата окончания в прошлом году?

Вы бы сформулировали задачу поточнее.

Может, так надо?
Код: sql
1.
2.
3.
4.
--  data_end меньше, чем 1 января следующего года
select * 
from rem 
where data_end < dateadd(yy, 1, convert(date, str(year(getdate()) + '0101')))
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765213
Юлик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgА дата начала тут важна, или как?
"дата окончания меньше чем нынешний год" - то есть дата окончания в прошлом году?

Вы бы сформулировали задачу поточнее.

Может, так надо?
Код: sql
1.
2.
3.
4.
--  data_end меньше, чем 1 января следующего года
select * 
from rem 
where data_end < dateadd(yy, 1, convert(date, str(year(getdate()) + '0101')))


Вообщем, есть куча оборудования,которое ремонтируется, ремонтировалось( с 2014,скажем года) или у которого запланирован ремонт
даты ремонтов:
1 е оборудование: с 10.10.2015 00:00 по 20.12.2015 00:00
2е оборудование: с 11.01.2017 00:00 по 20.11.2018 00:00
3е оборудование: с 10.07.2018 00:00 по 04.09.2019 00:00
4еоборудование: с 22.03.2017 00:00 по 31.12.2021 00:00
5еоборудование: с 31.12.2018 00:00 по 01.01.2019 10:22

Мне надо отобрать данные, у которых ремонт попадает именно на нынешний год,т.е моем случае,это будут 3 , 4 и 5 оборудование. Правда,если месяц отбора данных будет декабрь ,то брать не нынешний год, а следующий( и соответственно,тогда в список попадет только 4 оборудование)
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765326
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непонятно, зачем тут прибавляют '0101'.
Можно по-другому. D находится в текущем году, если
Код: sql
1.
2.
    D>=DATEADD(YEAR,DATEDIFF(YEAR,0,CURRENT_TIMESTAMP),0)
AND D< DATEADD(YEAR,1+DATEDIFF(YEAR,0,CURRENT_TIMESTAMP),0)
...
Рейтинг: 0 / 0
Проблема с датами.
    #39765487
Юлик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю всех,завтра на работе попробую
...
Рейтинг: 0 / 0
Проблема с датами.
    #39766132
Юлик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообщем,вот такой вариант подошел,все остальные выводили данные не попадающие в нынешний год..почему то
Код: sql
1.
2.
   select * from rem where DATEADD(YEAR,DATEDIFF(YEAR,0,getdate()),0) >=DATEADD(YEAR,DATEDIFF(YEAR,0,data_begin),0)
AND DATEADD(YEAR,DATEDIFF(YEAR,0,getdate()),0)< DATEADD(YEAR,1+DATEDIFF(YEAR,0,data_end),0)

Юлик,
...
Рейтинг: 0 / 0
Проблема с датами.
    #39766144
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Условие должно быть SARGable!
Если вам это не нужно (??), делайте как хотите!
...
Рейтинг: 0 / 0
Проблема с датами.
    #39766279
Юлик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iapУсловие должно быть SARGable!
Если вам это не нужно (??), делайте как хотите!
там впереди 3 ключа еще идут
...
Рейтинг: 0 / 0
Проблема с датами.
    #39766636
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЮликiapУсловие должно быть SARGable!
Если вам это не нужно (??), делайте как хотите!
там впереди 3 ключа еще идутЗачем делать плохо, если сделать хорошо занимает такое же время, и код получается не больше и не сложнее?
...
Рейтинг: 0 / 0
Проблема с датами.
    #39767324
Юлик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мой вопрос закрыт,так как оказалось,в задаче бралась не сегодняшняя дата и из неё год вычленялся,а нужно было год вводить ручками(т.е переменной он уже должен быть присвоен). Пришел "оптимизатор" и подсказал такой код( при том,что, если использовать getdate() ,то я правильно раньше думал)..
Код: sql
1.
2.
3.
4.
5.
6.
declare @year int
declare @data_begin as datetime,@data_end as datetime
set @year=2019
set @data_begin=datefrompart(@year)+'0101'
set @data_end=datefrompart(@year)+'1231'
select * from rem where data_end<=@data_begin and data_begin>=@data_end
...
Рейтинг: 0 / 0
Проблема с датами.
    #39767415
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юликмой вопрос закрыт,так как оказалось,в задаче бралась не сегодняшняя дата и из неё год вычленялся,а нужно было год вводить ручками(т.е переменной он уже должен быть присвоен). Пришел "оптимизатор" и подсказал такой код( при том,что, если использовать getdate() ,то я правильно раньше думал)..
Код: sql
1.
2.
3.
4.
5.
6.
declare @year int
declare @data_begin as datetime,@data_end as datetime
set @year=2019
set @data_begin=datefrompart(@year)+'0101'
set @data_end=datefrompart(@year)+'1231'
select * from rem where data_end<=@data_begin and data_begin>=@data_end

Не в 2019 году:
Код: sql
1.
2.
DECLARE @Year CHAR(4)='2019';
SELECT * FROM rem WHERE data_end<@Year OR data_begin> DATEADD(YEAR,1,@Year);


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


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