Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Потому что у вас даты - разные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] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2396 |
Vinil,set dateformat ymd |
11 янв 16, 10:27 [18661063] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||
11 янв 16, 10:31 [18661078] Ответить | Цитировать Сообщить модератору |
Vinil Member Откуда: Сообщений: 28 |
alexeyvg, Возможно конечно, но у меня имеется справочная таблица с датами и почему то с 2016 года, именно по дню недели пошел сдвиг. Спасибо всем за оперативность. |
11 янв 16, 10:35 [18661095] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
"Дата" у вас это какой тип ? Символьный что ли ? |
||
11 янв 16, 10:36 [18661099] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Вы в свою переменную заносите разные даты. Потому что вы по-разному конвертируете _символьную_ строку Причем тут таблица, где уже занесены какие то даты ? |
||
11 янв 16, 10:54 [18661173] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Vinil Member Откуда: Сообщений: 28 |
Выставил формат set dateformat ymd, и все встало на место. |
11 янв 16, 11:11 [18661255] Ответить | Цитировать Сообщить модератору |
Bator Member Откуда: Порт пяти морей Сообщений: 439 |
Это лечение симптомов, о чем и писали выше: 18661078 Коротко: ты в своем месте написал так, кто-то в другом месте написал другое и в результате оба получили невалидные результаты, которые могут быть обнаружены и через несколько лет неправильно принятых решений на основе выданных вами данных
|
||
11 янв 16, 11:17 [18661287] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47050 |
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] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
"Съехать" данные в существующем поле типа datetime не могут, независимо от любых настроек сервера и базы. Там, для типа данных datetime, хранится количество дней в виде целого числа. Вы не торопитесь, прочитайте ответы, будет понимание, что и как у вас происходит, и как быстро и просто писать правильный код, работающий при любых настройках.
|
||||
11 янв 16, 11:36 [18661376] Ответить | Цитировать Сообщить модератору |
Vinil Member Откуда: Сообщений: 28 |
alexeyvg, Я не говорил, что дата в поле типа datetime "съехало значение", я описывал проблему, где для справочной таблицы дат при генерации данных за 2016 год, неверное вставилось значение "день недели"= datepart(dw,@full_date) где @full_date datetime, в следствии неверного формата даты. что касается, set dateformat ymd какое имеется другое решение? |
11 янв 16, 12:42 [18661686] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47050 |
|
||
11 янв 16, 13:23 [18661920] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
2ое января - это суббота, а 1ое февраля - это понедельник Так что "вставилось" все правильно Это кто-то неправильно символьные строки считает датами |
||
11 янв 16, 13:26 [18661933] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
18661324 |
||
11 янв 16, 13:38 [18661986] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
18661219 |
||||
11 янв 16, 13:40 [18661993] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Потому что вы немножко путаетесь в форматах хранения, форматах литералов, и в зависимости работы функций от настроек. Вот лучше это внимательно прочитать, потому что у вас сразу 2 ошибки в коде, а не одна. |
||
11 янв 16, 13:43 [18662011] Ответить | Цитировать Сообщить модератору |
Vinil Member Откуда: Сообщений: 28 |
iap, Спасибо за совет |
11 янв 16, 14:02 [18662129] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47050 |
то увидели бы ещё одно решение: 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] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
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] Ответить | Цитировать Сообщить модератору |
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;
|
||||
11 янв 16, 15:32 [18662835] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
Skilled Member Откуда: Сообщений: 2 |
Может кто подскажет, можно ли как то динамечски установить настройку datefirst для текущей сессии в зависимости от принимаемых параметров? Мне нужно сделать сортировку по datepart(weekday...), но первый день недели зарание не известен, я получаю его в процедуру. К примеру, если мне передали 3(среда), то сортировку нужно начать именно с этого дня недели, потом чт, пт, сб, вс, пн, вт. Или может есть какое то другое решение? |
20 фев 17, 19:58 [20230551] Ответить | Цитировать Сообщить модератору |
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 | ![]() |