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

Откуда: Санкт-Петербург
Сообщений: 67
Добрый день!

Пользуюсь приложением "Учет пациентов" от компании "Простой софт".

Пытаюсь сделать групповое обновление в таблице базы данных:

UPDATE tblSchedule SET [Workplace] = 'Иванов И.И' WHERE FORMAT(ReceiveDate, 'dd.MM.yyyy, ddd') LIKE '%Ср%'
AND FORMAT(ReceiveDateTime, 'hh:mm') LIKE '08:00'

Функция FORMAT - аналог функции FORMAT в MS Access. См. ниже ее тело (приложение1)
При выполнении этой инструкции обновляются не среды, а четверги.
Пожалуйста, помогите понять почему это происходит :(

Приложение 1 :

USE [MyDB]
GO
/****** Object: UserDefinedFunction [dbo].[Format] Script Date: 01/12/2015 15:55:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Create date: 2014-11-16
-- Description: patial analog of Access and VB 'Format' function for datetime

ALTER FUNCTION [dbo].[Format](@Date datetime, @Format varchar(50) = 'yyyy-MM-dd')
RETURNS varchar(50)
AS
BEGIN
DECLARE @Result varchar(50)
DECLARE @Year varchar(50)
DECLARE @Month varchar(50)
DECLARE @Day varchar(50)
DECLARE @Hour varchar(50)
DECLARE @Minute varchar(50)
DECLARE @Second varchar(50)
DECLARE @WeekDay varchar(50)

SELECT @Year = YEAR(@Date)
SELECT @Month = Month(@Date)
SELECT @Day = Day(@Date)
SELECT @Hour = DATEPART(hour, @Date)
SELECT @Minute = DATEPART(minute, @Date)
SELECT @Second = DATEPART(second, @Date)
SELECT @WeekDay = DATEPART(WEEKDAY, @Date)

IF @Format Like 'hh_mm'
BEGIN
SELECT @Result = @Format
SELECT @Result = REPLACE(@Result, 'hh', RIGHT('0' + @Hour, 2))
SELECT @Result = REPLACE(@Result, 'mm', RIGHT('0' + @Minute, 2))
SELECT @Result = REPLACE(@Result, 'ss', RIGHT('0' + @Second, 2))
RETURN @Result
END

IF @Format Like 'hh_mm_ss'
BEGIN
SELECT @Result = @Format
SELECT @Result = REPLACE(@Result, 'hh', RIGHT('0' + @Hour, 2))
SELECT @Result = REPLACE(@Result, 'mm', RIGHT('0' + @Minute, 2))
SELECT @Result = REPLACE(@Result, 'ss', RIGHT('0' + @Second, 2))
RETURN @Result
END

IF LEN(@Format) <= 10
BEGIN
SELECT @Result = @Format
SELECT @Result = REPLACE(@Result, 'yyyy', @Year)
SELECT @Result = REPLACE(@Result, 'yy', @Year)
SELECT @Result = REPLACE(@Result, 'MM', RIGHT('0' + @Month, 2))
SELECT @Result = REPLACE(@Result, 'dd', RIGHT('0' + @Day, 2))
RETURN @Result
END

IF LEN(@Format) = 16 --yyyy_MM_dd_hh_mm
BEGIN
SELECT @Result = LEFT(@Format, 10)
SELECT @Result = REPLACE(@Result, 'MM', RIGHT('0' + @Month, 2))
SELECT @Result = @Result + RIGHT(@Format, 6)
SELECT @Result = REPLACE(@Result, 'mm', RIGHT('0' + @Minute, 2))
SELECT @Result = REPLACE(@Result, 'yyyy', @Year)
SELECT @Result = REPLACE(@Result, 'dd', RIGHT('0' + @Day, 2))
SELECT @Result = REPLACE(@Result, 'hh', RIGHT('0' + @Hour, 2))
SELECT @Result = REPLACE(@Result, 'ss', RIGHT('0' + @Second, 2))
RETURN @Result
END

IF LEN(@Format) = 19 --yyyy_MM_dd_hh_mm_ss
BEGIN
SELECT @Result = LEFT(@Format, 10)
SELECT @Result = REPLACE(@Result, 'MM', RIGHT('0' + @Month, 2))
SELECT @Result = @Result + RIGHT(@Format, 9)
SELECT @Result = REPLACE(@Result, 'mm', RIGHT('0' + @Minute, 2))
SELECT @Result = REPLACE(@Result, 'yyyy', @Year)
SELECT @Result = REPLACE(@Result, 'dd', RIGHT('0' + @Day, 2))
SELECT @Result = REPLACE(@Result, 'hh', RIGHT('0' + @Hour, 2))
SELECT @Result = REPLACE(@Result, 'ss', RIGHT('0' + @Second, 2))
RETURN @Result
END

IF UPPER(@Format) LIKE '__________, DDD' --dd.MM.yyyy, DDD
BEGIN
SELECT @Result = LEFT(@Format, 10)
SELECT @Result = REPLACE(@Result, 'dd', RIGHT('0' + @Day, 2))
SELECT @Result = REPLACE(@Result, 'MM', RIGHT('0' + @Month, 2))
SELECT @Result = REPLACE(@Result, 'yyyy', @Year)
SELECT @WeekDay = CASE WHEN @WeekDay=1 THEN 'Вс' WHEN @WeekDay=2 THEN 'Пн' WHEN @WeekDay=3 THEN 'Вт' WHEN @WeekDay=4 THEN 'Ср' WHEN @WeekDay=5 THEN 'Чт' WHEN @WeekDay=6 THEN 'Пт' WHEN @WeekDay=7 THEN 'Сб' END
SELECT @Result = @Result + ', ' + @WeekDay
RETURN @Result

END

RETURN @Result
END
12 янв 15, 16:01    [17106672]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а скорее всего у вас сервер русский и начало недели у вас пн ,а не вскр
12 янв 15, 16:04    [17106692]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Glory
Member

Откуда:
Сообщений: 104760
Новичок2012
При выполнении этой инструкции обновляются не среды, а четверги.
Пожалуйста, помогите понять почему это происходит :(

А сами посмотреть, что возвращает ваша функция, вы не можете что ли ?
12 янв 15, 16:05    [17106697]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Konst_One
Member

Откуда:
Сообщений: 11540
вообще не понятно зачем вам эта функция нужна, одни тормоза только.

datediff не хватает?
12 янв 15, 16:07    [17106705]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Новичок2012
UPDATE tblSchedule SET [Workplace] = 'Иванов И.И' WHERE FORMAT(ReceiveDate, 'dd.MM.yyyy, ddd') LIKE '%Ср%'
AND FORMAT(ReceiveDateTime, 'hh:mm') LIKE '08:00'



select top 1  ReceiveDate
from tblSchedule
where FORMAT(ReceiveDateTime, 'hh:mm') LIKE '08:00'
  and FORMAT(ReceiveDate, 'dd.MM.yyyy, ddd') LIKE '%Ср%' 
12 янв 15, 16:10    [17106719]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20607
WHERE DatePart(weekday, ReceiveDate) = 4
AND DatePart(hour, ReceiveDate) = 8
AND DatePart(minute, ReceiveDate) = 0
12 янв 15, 16:12    [17106733]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Замените
SELECT @WeekDay = DATEPART(WEEKDAY, @Date)
на
SELECT @WeekDay = WEEKDA(@Date, 1)

но использование функции - тот еще изврат.
Кстати, с SQL2012 FORMAT() - встроенная, у Вас буду проблемы при апгрейде.
12 янв 15, 16:15    [17106743]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Новичок2012
Member

Откуда: Санкт-Петербург
Сообщений: 67
Владислав Колосов,

Спасибо за ваш ответ! Не знала что теперь функция FORMAT() есть в SQL SERVER 2012. Ранее ее не было.

А вот ваше предложение по замене не подходит :

Возвращает ошибку "WEEKDAY не является известным именем встроенной функции"
12 янв 15, 17:21    [17107165]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Новичок2012
Member

Откуда: Санкт-Петербург
Сообщений: 67
Maxx,

А я могу этот параметр (начало недели) для сервера где-нибудь установить ?
Если да, то не подскажите где ?
12 янв 15, 17:27    [17107200]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Тогда SET DATEFIRST 7.
12 янв 15, 17:30    [17107218]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
o-o
Guest
Maxx
а скорее всего у вас сервер русский и начало недели у вас пн ,а не вскр

это скорее у ее логина язык русский, а сервер-то ни при чем :)
Новичок2012, у вас если у логинов разные дефолтные языки,
то у разных исполнителей одного и того же кода будут разные ответы в DATEPART(WEEKDAY, @Date).
to Владислав Колосов: a что, в функции можно SET прописать?
12 янв 15, 17:37    [17107238]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Новичок2012
Maxx,

А я могу этот параметр (начало недели) для сервера где-нибудь установить ?
Если да, то не подскажите где ?


можно установить для текущего подключения:
set datefirst 7

и еще этот параметр зависит от текущего языка. язык можно тоже выставить для текущего подключения:
set language English
либо поменять язык по умолчанию для логина, под которым выполняется запрос, на английский.
12 янв 15, 17:37    [17107242]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
WHERE DATEDIFF(DAY,0,ReceiveDate)%7=2 /*среда*/
  AND CONVERT(CHAR(5),ReceiveDate,8)='08:00';
12 янв 15, 17:38    [17107244]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
o-o
to Владислав Колосов: a что, в функции можно SET прописать?


можно же перед update-ом прописать. правильнее было бы, конечно, чтоб сама функция @@datefirst учитывала, но стоит ли туда лезть.
12 янв 15, 17:43    [17107276]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Новичок2012
Member

Откуда: Санкт-Петербург
Сообщений: 67
Владислав Колосов,

Внутри функции нельзя использовать SET, возникает ошибка "Недопустимое использование оператора "SET COMMAND", оказывающего побочное действие, в функции."
Нельзя ли по-другому как-то узнать про текущую установку DATEFIRST? Чтобы, потом прибавить/отнять единицу к полученному значению @WEEKDAY
12 янв 15, 17:49    [17107313]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
o-o
Guest
iap
WHERE DATEDIFF(DAY,0,ReceiveDate)%7=2 /*среда*/

вот-вот, даешь языконезависимый код!
to daw: при всем уважении, лучше не SET-ами поправлять, а вообще от настроек отвязаться.
просто из религиозных соображений: нехорошо иметь ф-цию, к-ую один может вызвать и получить одно,
а другой -- другое
12 янв 15, 17:49    [17107315]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Konst_One
Member

Откуда:
Сообщений: 11540
o-o
iap
WHERE DATEDIFF(DAY,0,ReceiveDate)%7=2 /*среда*/


вот-вот, даешь языконезависимый код!
to daw: при всем уважении, лучше не SET-ами поправлять, а вообще от настроек отвязаться.
просто из религиозных соображений: нехорошо иметь ф-цию, к-ую один может вызвать и получить одно,
а другой -- другое


+1
я сразу намекал на это, но искать лень было по форуму код iap, он его уже выкладывал когда-то давно
12 янв 15, 17:51    [17107322]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
o-o
просто из религиозных соображений: нехорошо иметь ф-цию, к-ую один может вызвать и получить одно,
а другой -- другое


да кто бы спорил. еще бы программистам компании "Простой софт" это кто рассказал. :)
12 янв 15, 18:00    [17107373]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
o-o
Guest
Новичок2012
Нельзя ли по-другому как-то узнать про текущую установку DATEFIRST?

узнать можно: @@datefirst (daw написал, только очень неявно)
хотя iap уже выдал решение:
зная день недели базовой даты (0), можно и у остальных посчитать делением по модулю
12 янв 15, 18:01    [17107377]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Новичок2012
Member

Откуда: Санкт-Петербург
Сообщений: 67
А можно я внутри своей функции напишу вот так
SELECT @WeekDay = DATEPART(WEEKDAY, @Date) + DATEPART(WEEKDAY, 0)
?
12 янв 15, 18:09    [17107409]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
o-o
Guest
daw
еще бы программистам компании "Простой софт" это кто рассказал. :)

все когда-то аукнется :)

хотите анекдот про любителей зоопарков и зоофункций?
у нас у всех логины -- виндовые группы.
и кто-то давным-давно им раздал разные дефолтные языки.
мне даже такое в голову прийти не могло, пока вдруг не случилось...
одного товарища внезапно слегка повысили и в другую виндовую группу впихнули,
и вдруг некая СУПЕР-ФУНКЦИЯ стала ТОЛьКО ему не то возвращать,
какие были квадратные глаза
а меня бесит, когда сервер ошибки пишет не на инглише, поэтому мне в глазa ответ сам бросился.

это, кстати, камешек не только в огород криворуких кодеров, но и в MS-овский тоже.
как-то нехорошо получается с виндовыми группами, действительно, какой язык должен победить,
если логин в 2 разные группы входит и у групп разные дефолтные языки?
у товарища как-то неожиданно победил совсем не инглиш...
12 янв 15, 18:28    [17107485]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Ну для такой функции можно дернуть SET DATEFIRST 7 перед вызовом до update.
Одна строчка кода, а сколько удовольствия.
12 янв 15, 19:01    [17107575]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Новичок2012
Member

Откуда: Санкт-Петербург
Сообщений: 67
Спасибо всем большое!

Нашла правильный для себя ответ. Заменила на :

SELECT @WeekDay = DATEPART(WEEKDAY, @Date) + DATEPART(WEEKDAY, 0) % 7
13 янв 15, 11:41    [17109838]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
o-o
Guest
Новичок2012,
девушка, вы что насчитали, то проверяете (на целой неделе, например)?

К сообщению приложен файл. Размер - 43Kb
13 янв 15, 11:55    [17109915]     Ответить | Цитировать Сообщить модератору
 Re: Update с пользовательской функцией Format  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
кастыле- фабрика
13 янв 15, 12:01    [17109939]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить