Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
Добрый день.

DatePart(DW, @Date) на разных субд (я бы сказал на разных серверах) показывает разные значения. Понимаю, что например в США воскресенье будет иметь значение 1 а в России 7. Но как добиться, чтоб этот параметр был одинаков, при выполнении запроса на разных серверах?

использую для определения дня недели:
         CASE
            WHEN DatePart(DW, @Date) = 1 THEN 'пн.'
            WHEN DatePart(DW, @Date) = 2 THEN 'вт.'
            WHEN DatePart(DW, @Date) = 3 THEN 'ср.'
            WHEN DatePart(DW, @Date) = 4 THEN 'чт.'
            WHEN DatePart(DW, @Date) = 5 THEN 'пт.'
            WHEN DatePart(DW, @Date) = 6 THEN 'сб.'
            WHEN DatePart(DW, @Date) = 7 THEN 'вс.'
          END
14 дек 16, 10:09    [20000877]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Игорь_UUS,

в инструкции по DATEPART - SET DATEFIRST
14 дек 16, 10:12    [20000896]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
TaPaK
Игорь_UUS,

в инструкции по DATEPART - SET DATEFIRST


т.е. в хранимой процедуре, перед выполнение запроса, приведённого выше, выполнить SET DATEFIRST = 1

?
14 дек 16, 10:21    [20000959]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Игорь_UUS,

или язык по умолчанию измените или SET DATEFIRST = 1 в сессии
14 дек 16, 10:26    [20000990]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Игорь_UUS
Добрый день.

DatePart(DW, @Date) на разных субд (я бы сказал на разных серверах) показывает разные значения. Понимаю, что например в США воскресенье будет иметь значение 1 а в России 7. Но как добиться, чтоб этот параметр был одинаков, при выполнении запроса на разных серверах?

использую для определения дня недели:
         CASE
            WHEN DatePart(DW, @Date) = 1 THEN 'пн.'
            WHEN DatePart(DW, @Date) = 2 THEN 'вт.'
            WHEN DatePart(DW, @Date) = 3 THEN 'ср.'
            WHEN DatePart(DW, @Date) = 4 THEN 'чт.'
            WHEN DatePart(DW, @Date) = 5 THEN 'пт.'
            WHEN DatePart(DW, @Date) = 6 THEN 'сб.'
            WHEN DatePart(DW, @Date) = 7 THEN 'вс.'
          END
Применяйте DATEDIFF(DAY,0,@Date)%7 или (@@DATEFIRST+DATEPART(WEEKDAY,@Date))%7
Только посмотрите, сколько получается для конкретных дней недели в каждом варианте
Почитайте ещё FAQ
14 дек 16, 10:29    [20001013]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
Диклевич Александр
Member

Откуда:
Сообщений: 611
Или можно так:
CASE ((@@DATEFIRST + DATEPART(dw, @Date) - 2) % 7 + 1)
    WHEN 1 THEN 'пн.'
    ...
    WHEN 7 THEN 'вс.'
END
14 дек 16, 10:32    [20001029]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Диклевич Александр
Или можно так:
CASE ((@@DATEFIRST + DATEPART(dw, @Date) - 2) % 7 + 1)
    WHEN 1 THEN 'пн.'
    ...
    WHEN 7 THEN 'вс.'
END
А зачем 1 прибавлять?
14 дек 16, 10:34    [20001038]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
Диклевич Александр
Member

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

а что, не работает?
14 дек 16, 10:45    [20001106]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Диклевич Александр
iap,

а что, не работает?
Ну давайте ещё число прибавим. Зачем лишнее?
14 дек 16, 10:47    [20001117]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
Диклевич Александр
Member

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

а вы пробовали выполнить?
14 дек 16, 10:55    [20001161]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Диклевич Александр
iap,

а вы пробовали выполнить?
Выполнить что?
А вообще, FAQ почитать не пробовали?
CASE (@@DATEFIRST+DATEPART(WEEKDAY,@Date))%7
 WHEN 0 THEN 'суббота'
 WHEN 1 THEN 'воскресенье'
 WHEN 2 THEN 'понедельник'
 WHEN 3 THEN 'вторник'
 WHEN 4 THEN 'среда'
 WHEN 5 THEN 'четверг'
 WHEN 6 THEN 'пятница'
END
14 дек 16, 11:03    [20001206]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
Диклевич Александр
Member

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

хотя бы вот это:
SET DATEFIRST 7;

DECLARE @Date [date] = '20161212';

SELECT CASE ((@@DATEFIRST + DATEPART(dw, @Date) - 2) % 7 + 1)
    WHEN 1 THEN N'пн.'
    WHEN 2 THEN N'вт.'
    WHEN 3 THEN N'ср.'
    WHEN 4 THEN N'чт.'
    WHEN 5 THEN N'пт.'
    WHEN 6 THEN N'сб.'
    WHEN 7 THEN N'вс.'
END;


просто в моем случае, понедельник это 1, вторник - 2, и т.д.
14 дек 16, 11:15    [20001288]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Диклевич Александр,

а если CASE c 44 начинать, то + 44 :)
14 дек 16, 11:27    [20001373]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
Диклевич Александр
Member

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

причем тут CASE, если речь идет о днях недели, которые в большинстве своем нумеруются от одного до семи?
14 дек 16, 11:41    [20001473]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
invm
Member

Откуда: Москва
Сообщений: 9724
Диклевич Александр,

До вас пытаются донести, что для получения наименования дня недели (а именно это ТСу и нужно) не обязательно эти самые дни нумеровать с 1.
14 дек 16, 12:15    [20001694]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
o-o
Guest
не проще ли логины привести в порядок,
выставив всем один и тот же дефолтный язык на обоих серверах?
14 дек 16, 12:21    [20001733]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
Диклевич Александр
Member

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

я вижу то же нумерование от 1 до 7 в первом посте, и тема не о наименовании, но о DatePart(DW, @Date), что суть есть номер от 1 до 7.
14 дек 16, 12:27    [20001763]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
o-o
не проще ли логины привести в порядок,
выставив всем один и тот же дефолтный язык на обоих серверах?
На двух? А у нас десятки серверов в разных странах
14 дек 16, 12:27    [20001768]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
o-o
не проще ли логины привести в порядок,
выставив всем один и тот же дефолтный язык на обоих серверах?
Для тиражируемых решений (в т.ч. тиражируемых внутри организаций) лучше писать код настройко-независимый...
14 дек 16, 12:27    [20001769]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Диклевич Александр
invm,

я вижу то же нумерование от 1 до 7 в первом посте, и тема не о наименовании, но о DatePart(DW, @Date), что суть есть номер от 1 до 7.
Если это так, то вы безусловно правы.
И запрос ваш правильный.
14 дек 16, 12:28    [20001778]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
alexeyvg
o-o
не проще ли логины привести в порядок,
выставив всем один и тот же дефолтный язык на обоих серверах?
Для тиражируемых решений (в т.ч. тиражируемых внутри организаций) лучше писать код настройко-независимый...

тогда к чему вся возня - DATENAME(WEEKDAY,GETDATE())
14 дек 16, 12:30    [20001796]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
iap
o-o
не проще ли логины привести в порядок,
выставив всем один и тот же дефолтный язык на обоих серверах?
На двух? А у нас десятки серверов в разных странах
Вот вот. Зачем заморачиваться с настройками? Может, ещё и колелйшен выставлять? :-)
И вообще, решение далеко не всегда ставится на свой, отдельный сервер силами своего админа.
И потом, в процессе переписки с разными департаментами, у людей будет формироваться мнение "наколенный говнокод", и отношение будет формироваться как к низкооплачиваемым "простокодерам"...
14 дек 16, 12:31    [20001804]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
TaPaK
Игорь_UUS,

или язык по умолчанию измените или SET DATEFIRST = 1 в сессии


ещё маленький вопрос.

а в теле функции этот параметр нельзя назначить?

CREATE FUNCTION [dbo].[WeekDayName](
  @Date	DATETIME
) RETURNS NVARCHAR(3)
AS
BEGIN
  DECLARE @R NVARCHAR(3)
  
  SET DATEFIRST 1
  
  SET @R = (
    SELECT CASE
      WHEN DATEPART(WEEKDAY, @Date) = 1 THEN 'Пн.'
      WHEN DATEPART(WEEKDAY, @Date) = 2 THEN 'Вт.'
      WHEN DATEPART(WEEKDAY, @Date) = 3 THEN 'Ср.'
      WHEN DATEPART(WEEKDAY, @Date) = 4 THEN 'Чт.'
      WHEN DATEPART(WEEKDAY, @Date) = 5 THEN 'Пт.'
      WHEN DATEPART(WEEKDAY, @Date) = 6 THEN 'Сб.'
      WHEN DATEPART(WEEKDAY, @Date) = 7 THEN 'Вс.'
    END
  )
  
  RETURN @R
END
GO


пишет ошибку в момент компиляции
"Недопустимое использование оператора "SET COMMAND", оказывающего побочное действие, в функции."
14 дек 16, 12:31    [20001811]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
TaPaK
alexeyvg
пропущено...
Для тиражируемых решений (в т.ч. тиражируемых внутри организаций) лучше писать код настройко-независимый...

тогда к чему вся возня - DATENAME(WEEKDAY,GETDATE())
И на каком языке результат?
Кстати, если так написать в функции, то она не будет детерминированной.
14 дек 16, 12:32    [20001816]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться. DatePart(DW, @Date) может иметь разные значения на разных СУБД  [new]
o-o
Guest
iap
o-o
не проще ли логины привести в порядок,
выставив всем один и тот же дефолтный язык на обоих серверах?
На двух? А у нас десятки серверов в разных странах

он вроде про свои сервера спрашивал, не про ваши.
не думаю, что их код с русскими наименованиями
используют в нерусскоязычных странах, ок?

а вот то, что выявил этот код, есть рассогласование языков логинов,
и это не есть гуд.
особенно на одном сервере,
когда часть логинов имеет один язык, часть другой.
при этом юзеры виндовые.
у нас были сюрпризы, когда один и тот же юзер входит в 2 виндовые группы
и у них разные языки.
14 дек 16, 12:32    [20001820]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить