powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Неважный вопрос, но не дает покоя. Объясните, пожалуйста.
9 сообщений из 9, страница 1 из 1
Неважный вопрос, но не дает покоя. Объясните, пожалуйста.
    #40105478
dpotap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет, ребята!

Подскажите, пожалуйста, почему именно так реализовано.
Использую для обслуживания баз скрипты от MS tigertoolbox (https://github.com/microsoft/tigertoolbox)
На моем sql сервере @@DATEFIRST = 1 (SQL 2008 R2 Rus - 10.50.6560.0 (X64) (Build 7601: Service Pack 1)).
Для запуска обслуживания в выходные в скрипте для определения Воскресенья используется код:
-- Is it Sunday yet?
IF (SELECT 1 & POWER(2, DATEPART(weekday, GETDATE())-1)) > 0
BEGIN
PRINT '** Start: ' + CONVERT(VARCHAR, GETDATE())
<..............>
END
ELSE
BEGIN
PRINT '** Skipping: Today is not Sunday - ' + CONVERT(VARCHAR, GETDATE())
END;
Да у меня задание на самом деле стартует в понедельник, не в этом суть, но почему именно так определяется день недели?
(SELECT 1 & POWER(2, DATEPART(weekday, GETDATE())-1)) > 0, чем плох DATEPART(weekday, GETDATE())?

Также в скрипте находил код:
-- What day is today? 1=Sunday, 2=Monday, 4=Tuesday, 8=Wednesday, 16=Thursday, 32=Friday, 64=Saturday
SELECT @TodayBucket = CASE WHEN 1 & POWER(2, DATEPART(weekday, GETDATE())-1) = 1 THEN 1
WHEN 2 & POWER(2, DATEPART(weekday, GETDATE())-1) = 2 THEN 2
WHEN 4 & POWER(2, DATEPART(weekday, GETDATE())-1) = 4 THEN 3
WHEN 8 & POWER(2, DATEPART(weekday, GETDATE())-1) = 8 THEN 4
WHEN 16 & POWER(2, DATEPART(weekday, GETDATE())-1) = 16 THEN 5
WHEN 32 & POWER(2, DATEPART(weekday, GETDATE())-1) = 32 THEN 6
WHEN 64 & POWER(2, DATEPART(weekday, GETDATE())-1) = 64 THEN 7
END;
Почему так???

PS Если по данному скрипту/обслуживанию еще можете подсказать, возможно это best practices, но я не нашел - при обслуживании для определения списка баз исключаются базы более 4 Гб, ниже код, почему так? Хотя я еще почитаю про эти скрипты.

/*
DBCC UPDATEUSAGE corrects the rows, used pages, reserved pages, leaf pages and data page counts for each partition in a table or index.
IMPORTANT: Consider running DBCC UPDATEUSAGE routinely (for example, weekly) only if the database undergoes frequent Data Definition Language (DDL) modifications, such as CREATE, ALTER, or DROP statements.
http://msdn.microsoft.com/en-us/library/ms188414.aspx
Exludes all Offline or Read-Only DBs. Also excludes all databases over 4GB in size.
*/
......
SELECT DISTINCT QUOTENAME(d.name), 0 FROM sys.databases d
INNER JOIN sys.master_files smf ON d.database_id = smf.database_id
WHERE d.is_read_only = 0 AND d.state = 0 AND d.database_id <> 2 AND smf.type = 0 AND (smf.size * 8)/1024 < 4096
......

Всем спасибо заранее!
...
Рейтинг: 0 / 0
Неважный вопрос, но не дает покоя. Объясните, пожалуйста.
    #40105482
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dpotap
Также в скрипте находил код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
-- What day is today? 1=Sunday, 2=Monday, 4=Tuesday, 8=Wednesday, 16=Thursday, 32=Friday, 64=Saturday
		SELECT @TodayBucket = CASE WHEN 1 & POWER(2, DATEPART(weekday, GETDATE())-1) = 1 THEN 1 
				WHEN 2 & POWER(2, DATEPART(weekday, GETDATE())-1) = 2 THEN 2
				WHEN 4 & POWER(2, DATEPART(weekday, GETDATE())-1) = 4 THEN 3
				WHEN 8 & POWER(2, DATEPART(weekday, GETDATE())-1) = 8 THEN 4
				WHEN 16 & POWER(2, DATEPART(weekday, GETDATE())-1) = 16 THEN 5
				WHEN 32 & POWER(2, DATEPART(weekday, GETDATE())-1) = 32 THEN 6
				WHEN 64 & POWER(2, DATEPART(weekday, GETDATE())-1) = 64 THEN 7
			END;


Почему так???

прогреть сервер ))

пс
крОсивый "индусский код"
...
Рейтинг: 0 / 0
Неважный вопрос, но не дает покоя. Объясните, пожалуйста.
    #40105499
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dpotap
-- What day is today? 1=Sunday, 2=Monday, 4=Tuesday, 8=Wednesday, 16=Thursday, 32=Friday, 64=Saturday
SELECT @TodayBucket = CASE WHEN 1 & POWER(2, DATEPART(weekday, GETDATE())-1) = 1 THEN 1
WHEN 2 & POWER(2, DATEPART(weekday, GETDATE())-1) = 2 THEN 2
WHEN 4 & POWER(2, DATEPART(weekday, GETDATE())-1) = 4 THEN 3
WHEN 8 & POWER(2, DATEPART(weekday, GETDATE())-1) = 8 THEN 4
WHEN 16 & POWER(2, DATEPART(weekday, GETDATE())-1) = 16 THEN 5
WHEN 32 & POWER(2, DATEPART(weekday, GETDATE())-1) = 32 THEN 6
WHEN 64 & POWER(2, DATEPART(weekday, GETDATE())-1) = 64 THEN 7
END;
Почему так???
Это соответствует кодировке дней недели в msdb.dbo.sysschedules
https://docs.microsoft.com/ru-ru/sql/relational-databases/system-tables/dbo-sysschedules-transact-sql?view=sql-server-ver15
...
Рейтинг: 0 / 0
Неважный вопрос, но не дает покоя. Объясните, пожалуйста.
    #40105546
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dpotap,

Решение для обслуживания баз:
https://ola.hallengren.com

авторпочему именно так определяется день недели?
Спросите индусов, который это писали... У них SET DATEFIRST 7, у нас 1.
...
Рейтинг: 0 / 0
Неважный вопрос, но не дает покоя. Объясните, пожалуйста.
    #40105548
Как вариант ставлю свои пять копеек - https://github.com/sergiisyrovatchenko/SQLIndexManager
...
Рейтинг: 0 / 0
Неважный вопрос, но не дает покоя. Объясните, пожалуйста.
    #40105580
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Syrovatchenko
Как вариант ставлю свои пять копеек - https://github.com/sergiisyrovatchenko/SQLIndexManager


пока вынимай свои 5 копеек, ТС пока заблудший овц "почему именно так определяется день недели"
...
Рейтинг: 0 / 0
Неважный вопрос, но не дает покоя. Объясните, пожалуйста.
    #40105686
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТС спросил: " почему именно так определяется день недели?
(SELECT 1 & POWER(2, DATEPART(weekday, GETDATE())-1)) > 0, чем плох DATEPART(weekday, GETDATE())
"?

invm ответил: " Это соответствует кодировке дней недели в msdb.dbo.sysschedules ".

И все же, почему используется такая кодировка 1=Sunday, 2=Monday, 4=Tuesday, 8=Wednesday, 16=Thursday, 32=Friday, 64=Saturday?

Потому что при такой кодировке дней недели они могут быть представлены множеством , т.е. несколько дней недели можно представить одним числом, например:
1 --> {Sunday}, событие должно произойти в воскресенье.
2 --> {Monday}, событие должно произойти в понедельник.
3 = 1 + 2 --> {Sunday} U {Monday} = {Sunday, Monday}, событие должно произойти и в воскресенье, и в понедельник.

При DATEPART одно число представляет один день. 3 --> Tuesday, событие должно произойти во вторник.

Следовательно, это два разных способа представления дней недели, каждый из которых имеет свою область применения.
В той же таблице msdb.dbo.sysschedules при значении аргумента freq_type равным 8 в аргументе freq_interval используется один способ представления дней недели, а при значении 32 - другой способ.

Что касается кода для преобразования одного представления дней недели в другое, то выражение 1 & 2 weekday вполне нормальное, в котором ключевой операцией является битовая операция & (bitwise AND).
...
Рейтинг: 0 / 0
Неважный вопрос, но не дает покоя. Объясните, пожалуйста.
    #40105778
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l
ТС спросил: " почему именно так определяется день недели?
(SELECT 1 & POWER(2, DATEPART(weekday, GETDATE())-1)) > 0, чем плох DATEPART(weekday, GETDATE())
"?

invm ответил: " Это соответствует кодировке дней недели в msdb.dbo.sysschedules ".

И все же, почему используется такая кодировка 1=Sunday, 2=Monday, 4=Tuesday, 8=Wednesday, 16=Thursday, 32=Friday, 64=Saturday?

Потому что при такой кодировке дней недели они могут быть представлены множеством , т.е. несколько дней недели можно представить одним числом, например:
1 --> {Sunday}, событие должно произойти в воскресенье.
2 --> {Monday}, событие должно произойти в понедельник.
3 = 1 + 2 --> {Sunday} U {Monday} = {Sunday, Monday}, событие должно произойти и в воскресенье, и в понедельник.

При DATEPART одно число представляет один день. 3 --> Tuesday, событие должно произойти во вторник.

Следовательно, это два разных способа представления дней недели, каждый из которых имеет свою область применения.
В той же таблице msdb.dbo.sysschedules при значении аргумента freq_type равным 8 в аргументе freq_interval используется один способ представления дней недели, а при значении 32 - другой способ.

Что касается кода для преобразования одного представления дней недели в другое, то выражение 1 & 2 weekday вполне нормальное, в котором ключевой операцией является битовая операция & (bitwise AND).


"Потому что" у них там первый день недели суньдей, а здесь - понедельнег
...
Рейтинг: 0 / 0
Неважный вопрос, но не дает покоя. Объясните, пожалуйста.
    #40106056
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TC спросил: " Также в скрипте находил код:
-- What day is today? 1=Sunday, 2=Monday, 4=Tuesday, 8=Wednesday, 16=Thursday, 32=Friday, 64=Saturday
...
Почему так???
"?

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


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