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

Откуда:
Сообщений: 28
Помогите разобраться, никак не могу понять почему день недели при разных типах данных выдает разное значение.
по календарю 02 января 2016 суббота

версия:
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64)
Aug 19 2014 12:21:34
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

пример запроса:

SET LANGUAGE russian

DECLARE @full_date datetime2
SET @full_date ='2016-01-02'

select datepart(dw,@full_date) as [DayOfWeek]

DayOfWeek
--------------------
6

DECLARE @full_date1 datetime
SET @full_date1 ='2016-01-02'
select datepart(dw,@full_date1) as [DayOfWeek]

DayOfWeek
--------------------
1
11 янв 16, 10:20    [18661038]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
Glory
Member

Откуда:
Сообщений: 104751
Потому что у вас даты - разные
SET LANGUAGE russian 

DECLARE @full_date	datetime2
SET @full_date ='2016-01-02'

DECLARE @full_date1	datetime
SET @full_date1 ='2016-01-02'
select @full_date, datepart(dw,@full_date) as [DayOfWeek], @full_date1, datepart(dw,@full_date1) as [DayOfWeek1]
11 янв 16, 10:25    [18661054]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2428
Vinil,

set dateformat ymd
11 янв 16, 10:27    [18661063]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
StarikNavy
Vinil,

set dateformat ymd
Не всегда это возможно, да и уследить трудно за кучей мест. Удобнее и проще писать программы, независящие от настройки коннекта.
11 янв 16, 10:31    [18661078]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
Vinil
Member

Откуда:
Сообщений: 28
alexeyvg,

Возможно конечно, но у меня имеется справочная таблица с датами и почему то с 2016 года, именно по дню недели пошел сдвиг.

Спасибо всем за оперативность.
11 янв 16, 10:35    [18661095]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
Glory
Member

Откуда:
Сообщений: 104751
Vinil
, но у меня имеется справочная таблица с датами

"Дата" у вас это какой тип ? Символьный что ли ?
11 янв 16, 10:36    [18661099]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
Vinil
Member

Откуда:
Сообщений: 28
Glory,

имеется таблица справочная

CREATE TABLE [DW].[DimDates](
[date_key] [smallint] IDENTITY(1,1) NOT NULL,
[full_date] [datetime] NULL,
[date_name] [char](12) NULL,
[week_name] [char](15) NULL,
[week_Sname] [char](15) NULL,
[week_no] [int] NULL,
[week_code] [int] NULL,
[Month_Name] [char](20) NULL,
[Month_No] [int] NULL,
[Month_code] [int] NULL,
[Month_Sname] [char](12) NULL,
[Month_Order] [int] NULL,
[Quarter_Name] [char](20) NULL,
[Quarter_No] [int] NULL,
[Quarter_code] [int] NULL,
[Quarter_Sname] [char](20) NULL,
[Season_Name] [char](5) NULL,
[Season_code] [int] NULL,
[Half_Year_Name] [char](20) NULL,
[Half_Year_No] [smallint] NULL,
[Half_Year_code] [smallint] NULL,
[Year_name] [char](20) NULL,
[Year_No] [smallint] NULL,
[fisk_week_name] [char](10) NULL,
[fisk_week_no] [int] NULL,
[fisk_Month_Name] [char](20) NULL,
[fisk_Month_No] [int] NULL,
[fisk_Quarter_Name] [char](20) NULL,
[fisk_Quarter_No] [int] NULL,
[fisk_Half_Year_Name] [char](20) NULL,
[fisk_Half_Year_No] [smallint] NULL,
[fisk_Year_name] [char](20) NULL,
[fisk_Year_No] [smallint] NULL,
[Day_Name] [char](12) NULL,
[Day_No] [smallint] NULL,
[Week_Begin_Date] [datetime] NULL,
[DayOfMonth] [smallint] NULL,
[Decade] [char](10) NULL,
[Decade_No] [int] NULL,
[DayOfYear] [int] NULL,
[ID] [int] NULL,
)

в которых поля
[Day_Name] [char](12) NULL,
[Day_No] [smallint] NULL,

заполнялись значениями

case datepart(dw,@full_date)
when 1 then 'Понедельник'
when 2 then 'Вторник'
when 3 then 'Среда'
when 4 then 'Четверг'
when 5 then 'Пятница'
when 6 then 'Суббота'
when 7 then 'Воскресенье'
end,
datepart(dw,@full_date)

и почему то именно с 2016 года справочник по дню недели съехал, сама же дата хранится в поле [full_date] datetime
где переменная @full_date datetime
11 янв 16, 10:50    [18661150]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
Glory
Member

Откуда:
Сообщений: 104751
Vinil
где переменная @full_date datetime

Вы в свою переменную заносите разные даты. Потому что вы по-разному конвертируете _символьную_ строку
Причем тут таблица, где уже занесены какие то даты ?
11 янв 16, 10:54    [18661173]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
Vinil,

Дело в формате даты.
Пиши всегда без минусов в дате, в формате 'yyyyMMdd' / 'yyyyMMdd hh:mm:ss.fff' и забудешь про такие проблемы.

Вангую, что ответ на следующий твой вопрос будет тут: 18617549

SET LANGUAGE russian

DECLARE @full_date datetime2
SET @full_date ='20160102'

select datepart(dw,@full_date) as [DayOfWeek]


DayOfWeek
--------------------
6

DECLARE @full_date1 datetime
SET @full_date1 ='20160102'
select datepart(dw,@full_date1) as [DayOfWeek]

DayOfWeek
--------------------
6
11 янв 16, 11:04    [18661219]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
Vinil
Member

Откуда:
Сообщений: 28
Выставил формат set dateformat ymd, и все встало на место.
11 янв 16, 11:11    [18661255]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
Это лечение симптомов, о чем и писали выше: 18661078
Коротко: ты в своем месте написал так, кто-то в другом месте написал другое и в результате оба получили невалидные результаты, которые могут быть обнаружены и через несколько лет неправильно принятых решений на основе выданных вами данных
Vinil
Выставил формат set dateformat ymd, и все встало на место.
11 янв 16, 11:17    [18661287]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Vinil
заполнялись значениями

case datepart(dw,@full_date)
when 1 then 'Понедельник'
when 2 then 'Вторник'
when 3 then 'Среда'
when 4 then 'Четверг'
when 5 then 'Пятница'
when 6 then 'Суббота'
when 7 then 'Воскресенье'
end,
CASE DATEDIFF(DAY,0,@full_date)%7
 WHEN 0 THEN 'Понедельник'
 WHEN 1 THEN 'Вторник'
 WHEN 2 THEN 'Среда'
 WHEN 3 THEN 'Четверг'
 WHEN 4 THEN 'Пятница'
 WHEN 5 THEN 'Суббота'
 WHEN 6 THEN 'Воскресенье'
END;
11 янв 16, 11:26    [18661324]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
Vinil
и почему то именно с 2016 года справочник по дню недели съехал, сама же дата хранится в поле [full_date] datetime
где переменная @full_date datetime

"Съехать" данные в существующем поле типа datetime не могут, независимо от любых настроек сервера и базы. Там, для типа данных datetime, хранится количество дней в виде целого числа.

Вы не торопитесь, прочитайте ответы, будет понимание, что и как у вас происходит, и как быстро и просто писать правильный код, работающий при любых настройках.

Vinil
Выставил формат set dateformat ymd, и все встало на место.
Вот это у вас костыль, который будет аукаться и вызывать проклятия админов и программистов в течении многих-многих лет эксплуатации вашей системы. Если это конечно не лаба в ВУЗе.
11 янв 16, 11:36    [18661376]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
Vinil
Member

Откуда:
Сообщений: 28
alexeyvg,

Я не говорил, что дата в поле типа datetime "съехало значение", я описывал проблему, где для справочной таблицы дат при генерации данных за 2016 год, неверное вставилось значение "день недели"= datepart(dw,@full_date) где @full_date datetime, в следствии неверного формата даты.

что касается, set dateformat ymd
какое имеется другое решение?
11 янв 16, 12:42    [18661686]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Vinil
alexeyvg,

Я не говорил, что дата в поле типа datetime "съехало значение", я описывал проблему, где для справочной таблицы дат при генерации данных за 2016 год, неверное вставилось значение "день недели"= datepart(dw,@full_date) где @full_date datetime, в следствии неверного формата даты.

что касается, set dateformat ymd
какое имеется другое решение?
Принимаете ответы только от alexeyvg?
11 янв 16, 13:23    [18661920]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
Glory
Member

Откуда:
Сообщений: 104751
Vinil
где для справочной таблицы дат при генерации данных за 2016 год, неверное вставилось значение "день недели"= datepart(dw,@full_date) где @full_date datetime, в следствии неверного формата даты.

2ое января - это суббота, а 1ое февраля - это понедельник
Так что "вставилось" все правильно
Это кто-то неправильно символьные строки считает датами
11 янв 16, 13:26    [18661933]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
Vinil
какое имеется другое решение?
Там выше был вариант.
18661324
11 янв 16, 13:38    [18661986]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
alexeyvg
Vinil
какое имеется другое решение?
Там выше был вариант.
18661324
Ну и второй вариант:
18661219
11 янв 16, 13:40    [18661993]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
Vinil
какое имеется другое решение?
Только нужно, прочитав про эти решения, не применять их, а прочитать внимательно весь топик, как я вам уже писал.

Потому что вы немножко путаетесь в форматах хранения, форматах литералов, и в зависимости работы функций от настроек.

Вот лучше это внимательно прочитать, потому что у вас сразу 2 ошибки в коде, а не одна.
11 янв 16, 13:43    [18662011]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
Vinil
Member

Откуда:
Сообщений: 28
iap,

Спасибо за совет
11 янв 16, 14:02    [18662129]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Vinil
iap,

Спасибо за совет
Если бы вы сначала полистали FAQ,
то увидели бы ещё одно решение:
CASE (@@DATEFIRST+DATEPART(WEEKDAY,@full_date))%7
 WHEN 2 THEN 'Понедельник'
 WHEN 3 THEN 'Вторник'
 WHEN 4 THEN 'Среда'
 WHEN 5 THEN 'Четверг'
 WHEN 6 THEN 'Пятница'
 WHEN 0 THEN 'Суббота'
 WHEN 1 THEN 'Воскресенье'
END;
Тоже не зависит ни от каких бы то ни было региональных настроек и годится для использования в функциях
11 янв 16, 14:09    [18662170]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
iap
Vinil
iap,

Спасибо за совет
Если бы вы сначала полистали FAQ,
то увидели бы ещё одно решение:
CASE (@@DATEFIRST+DATEPART(WEEKDAY,@full_date))%7
 WHEN 2 THEN 'Понедельник'
 WHEN 3 THEN 'Вторник'
 WHEN 4 THEN 'Среда'
 WHEN 5 THEN 'Четверг'
 WHEN 6 THEN 'Пятница'
 WHEN 0 THEN 'Суббота'
 WHEN 1 THEN 'Воскресенье'
END;

Тоже не зависит ни от каких бы то ни было региональных настроек и годится для использования в функциях
Или так:
CASE DATEPART(dw,@full_date) - DATEPART(dw,'19000101')
 WHEN 0 THEN 'Понедельник'
 WHEN 1 THEN 'Вторник'
 WHEN 2 THEN 'Среда'
 WHEN 3 THEN 'Четверг'
 WHEN 4 THEN 'Пятница'
 WHEN 5 THEN 'Суббота'
 WHEN 6 THEN 'Воскресенье'
END;
11 янв 16, 14:21    [18662220]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
отнюдь (-:
такой вариант, в отличии от первого, вернет null
declare @full_date datetime = '20160107'

set datefirst 3

select
CASE DATEPART(dw,@full_date) - DATEPART(dw,'19000101')
 WHEN 0 THEN 'Понедельник'
 WHEN 1 THEN 'Вторник'
 WHEN 2 THEN 'Среда'
 WHEN 3 THEN 'Четверг'
 WHEN 4 THEN 'Пятница'
 WHEN 5 THEN 'Суббота'
 WHEN 6 THEN 'Воскресенье'
END;




alexeyvg
iap
пропущено...
Если бы вы сначала полистали FAQ,
то увидели бы ещё одно решение:
CASE (@@DATEFIRST+DATEPART(WEEKDAY,@full_date))%7
 WHEN 2 THEN 'Понедельник'
 WHEN 3 THEN 'Вторник'
 WHEN 4 THEN 'Среда'
 WHEN 5 THEN 'Четверг'
 WHEN 6 THEN 'Пятница'
 WHEN 0 THEN 'Суббота'
 WHEN 1 THEN 'Воскресенье'
END;

Тоже не зависит ни от каких бы то ни было региональных настроек и годится для использования в функциях
Или так:
CASE DATEPART(dw,@full_date) - DATEPART(dw,'19000101')
 WHEN 0 THEN 'Понедельник'
 WHEN 1 THEN 'Вторник'
 WHEN 2 THEN 'Среда'
 WHEN 3 THEN 'Четверг'
 WHEN 4 THEN 'Пятница'
 WHEN 5 THEN 'Суббота'
 WHEN 6 THEN 'Воскресенье'
END;
11 янв 16, 15:32    [18662835]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: День недели  [new]
Skilled
Member

Откуда:
Сообщений: 3
Может кто подскажет, можно ли как то динамечски установить настройку datefirst для текущей сессии в зависимости от принимаемых параметров? Мне нужно сделать сортировку по datepart(weekday...), но первый день недели зарание не известен, я получаю его в процедуру. К примеру, если мне передали 3(среда), то сортировку нужно начать именно с этого дня недели, потом чт, пт, сб, вс, пн, вт. Или может есть какое то другое решение?
20 фев 17, 19:58    [20230551]     Ответить | Цитировать Сообщить модератору
 Re: День недели  [new]
iljy
Member

Откуда:
Сообщений: 8711
Skilled,

гораздо проще приводить день недели в выражении, чем городить динамику. Универсальный вариант (не зависящий от текущих настроек) выглядит так

set datefirst 6
declare @newDateFirst int = 3, @d date = getdate() - 1
select DATEPART(dw, @d), @@DATEFIRST, (DATEPART(dw, @d) + @@DATEFIRST + 7 - @newDateFirst - 1)%7 + 1


Можете поиграться с установками datefirst и @newDateFirst и посмотреть.
20 фев 17, 20:51    [20230685]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить