|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Здравствуйте. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Подскажите, пожалуйста, можно ли это было выполнить без convert'ов? Нужен текущий год (месяц, час...) и последний месяц (час, минута...) предыдущего. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 11:06 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Julia2000, вы очень неясно выражаетесь. Лучше приведите примеры того, что должно получиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 11:31 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
iap Julia2000, вы очень неясно выражаетесь. Лучше приведите примеры того, что должно получиться. Результат у меня получается правильный. Но, возможно, можно тоже самое сделать но без convert/cast, а с функциями даты/времени только? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 11:34 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Julia2000, Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 11:39 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Владислав Колосов Julia2000, Код: sql 1.
Спасибо. К сожалению версия сервера старая. Простите, забыла написать. MS SQL 2008 R2 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 11:49 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Честно не знаю какой вариант лучше. Первый с преобразованием в текст и обратно или этот. Лучше в смысле оптимальнее по производительности, когда запросов в определенный период могут быть тысячи. Для случая, когда нужно выбрать текущий год и последний месяц предыдущего года. Также бывают и иные вариации, вроде текущий месяц и последний час предыдущего месяца, но решение уже по имеющемуся шаблону...) Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 15:33 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Julia2000, Что Вам мешает сохранить последний месяц года в таблице? Запишите последние месяцы года на сто лет вперёд и не терзайтесь сомнениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 18:05 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Владислав Колосов, Извините, но не совсем подходит. Во-первых, происходит изменение данных и в таком случае понадобится синхронизировать, во-вторых, как я написала выше, это только один из случаев, когда данные за текущий год плюс последний месяц прошлого, а там есть еще и куча вариаций с таким же смыслом, например, за текущий месяц и последний день предыдущего и так далее, в итоге 1000 дополнительных таблиц, которые еще и синхронизировать... :\ ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 07:37 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
[removed] ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 09:02 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
А почему просто не вычесть из даты 13 месяцев? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 09:13 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
SQL2008 А почему просто не вычесть из даты 13 месяцев? Потому, что сегодня 18 июня и мне нужен период с 2020-12-01 0:00 по сейчас, а не минус 13 месяцев. ) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 10:04 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Если от текущей даты отнять деньГода, то получим последний день последнего месяца предыдущего года. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 11:41 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Wlr-l, Спасибо! Почему-то меня сначала смутило dateadd(day, -datepart(dayofyear, d) -30 , d) as m12first, но все правильно работает! Хотя и не идеально хороший вариант, исходя из всех моих запросов, но уже значительно проще. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 13:37 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Арифметика дат и арифметика времени существенно сложнее арифметики целых чисел и это от нас не зависит. Что касается 30-ти. Последний день последнего месяца (это декабрь) предыдущего года находится сравнительно просто: он отстоит от текущей даты на dayofyear дней. В декабре всегда 31 день и в обозримом будущем это не изменится. Следовательно, первый день декабря предыдущего года будет отстоять от текущей даты на dayofyear+30 дней в глубь веков (31-30=1). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 16:14 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Julia2000 Потому, что сегодня 18 июня и мне нужен период с 2020-12-01 0:00 по сейчас, а не минус 13 месяцев. ) "текущий год и месяц назад" - я понял как один год и месяц назад, т.е. 12 + 1 месяц назад. а подразумевалось, что "первый день последнего месяца прошлого года"? почему нельзя было сформулировать задачу по-русски? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2021, 08:31 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Wlr-l Арифметика дат и арифметика времени существенно сложнее арифметики целых чисел и это от нас не зависит. Что касается 30-ти. Последний день последнего месяца (это декабрь) предыдущего года находится сравнительно просто: он отстоит от текущей даты на dayofyear дней. В декабре всегда 31 день и в обозримом будущем это не изменится. Следовательно, первый день декабря предыдущего года будет отстоять от текущей даты на dayofyear+30 дней в глубь веков (31-30=1). А также я сомневалась за февраль, но оказалось все правильно работает. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2021, 10:25 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
SQL2008 Julia2000 Потому, что сегодня 18 июня и мне нужен период с 2020-12-01 0:00 по сейчас, а не минус 13 месяцев. ) "текущий год и месяц назад" - я понял как один год и месяц назад, т.е. 12 + 1 месяц назад. а подразумевалось, что "первый день последнего месяца прошлого года"? почему нельзя было сформулировать задачу по-русски? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2021, 19:00 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
iap SQL2008 пропущено... "текущий год и месяц назад" - я понял как один год и месяц назад, т.е. 12 + 1 месяц назад. а подразумевалось, что "первый день последнего месяца прошлого года"? почему нельзя было сформулировать задачу по-русски? Нужен текущий год (месяц, час...) и последний месяц (час, минута...) предыдущего . Извините, но это было в самом первом топике... Кроме того, чуть позже я Вам ответила, что мой же пример в первом топике дает правильный результат, но интересовалась другими методами решения... Но, тему можно закрыть, задача в общем-то решена. Если не будет иных супер-пупер-офигенных-грамотных предложений. ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2021, 07:47 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
2008R2: Код: sql 1. 2.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2021, 20:06 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Julia2000 Здравствуйте. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Подскажите, пожалуйста, можно ли это было выполнить без convert'ов? Нужен текущий год (месяц, час...) и последний месяц (час, минута...) предыдущего. Спасибо. тоже норм вариант. Так делал. Ну если надо вот-вот-вот всё до самой последней миллисекунды, то используйте строгое неравенство с началом следующего дня: то есть < '20210101' - можно и без времени - тогда всё вплоть до 20201231T23:59:59.99999 попадёт в отбор. Если я правильно понял Вашу задачу... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2021, 20:12 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
" тоже норм вариант. Так делал. " И я так делал, когда у нас появился SQL Server 7. С тех пор остался один конвертор данных одного типа приборов, который сравнивает даты путем их преобразования в строки. Он уже два десятка лет трудится безотказно, днем и ночью, утром и вечером, хотя сервер уже далеко не 7-ка и за это время сменилось не одно поколение приборов и конверторов их данных. Несмотря на это я не рекомендую этот способ, так как есть тип данных "дата" и в нем достаточно операций, чтобы получить любой результат. Секрет работы с датами прост. Да, в разных месяцах может быть разное число дней и даже бывают високосные годы. Но, если выбрать точку отсчета и перенумеровать последующие даты, то получим монотонную строго возрастающую последовательность. Главное уметь находить характерные (опорные) точки в этой последовательности дат. Такими точками могут быть начало года, квартала, месяца, недели. И уже от этих опорных точек искать расстояние до нужной даты в годах, кварталах, месяцах, неделях, днях. Я привел общеизвестный способ нахождения опорной точки, используя порядковый номер даты в пределах одного года. Можно пойти по другому пути. Найти начало года, а от него уже искать начало последнего месяца предыдущего года. Для поиска начала года нужно выбрать опорную дату. Выбор дня и месяца этой даты невелик: это 1-й день 1-го месяца года. Год можно выбрать от 1753 до 9999. Очень часто опорную дату задают нулем (0). Я считаю, что это хотя и короче, но снижается наглядность, так как 0 ассоциируется с числом, а не с датой. Теперь, если от года текущей даты отнять год опорной даты и полученную разность прибавить (разумеется, в годах) к опорной дате, то мы получим начало года, к которому относится текущая дата. Если от полученной даты отнять 31 день, то получим начало последнего года предыдущего месяца. Наконец-то, в новых версиях SQL сервера добавлены функции формирования дат со временем или без него из составных частей, например, datefromparts. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
И если формировать дату из строки, то выражение Код: sql 1.
можно упростить: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 22:40 |
|
текущий год и месяц назад
|
|||
---|---|---|---|
#18+
Осталось рассмотреть предложение Владислава Колосова: рассчитать заранее нужные даты и хранить их в таблице, не терзаясь сомнениями. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Данная таблица-календарь хранит для каждой даты из выбранного диапазона дат начало и конец последнего месяца предыдущего года. В данном случае хранится 4 тыс. дат, начиная с 2019 года, что должно хватить на 10 лет. Эта таблица рассчитывается один раз. Ничто не мешает добавить в нее столбцы с другими нужными данными и использовать их в других запросах. Также ничто не мешает сделать несколько разных таблиц-календарей. Конечно, начало и конец последнего месяца предыдущего года НЕ нужно хранить в рабочих таблицах. Таблицы, аналогичные календарю, я вынес в отдельную базу данных DIR и эта база данных эпизодически обновляется, не затрагивая основные базы данных. А вот некоторые процедуры расчета после таких обновлений существенно упрощаются. Эти таблицы не нужно ни с чем синхронизировать и какая разница для рабочих баз данных, сколько таблиц находится в БД DIR, одна или тысяча? Выбор расчета или таблицы-календаря регулируется "золотым правилом механики". ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 00:11 |
|
|
start [/forum/topic.php?fid=46&fpage=21&tid=1684572]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 263ms |
total: | 409ms |
0 / 0 |