如何在ms SQL server 2008中调用函数 [英] How do you call a function in ms SQL server 2008

查看:101
本文介绍了如何在ms SQL server 2008中调用函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

MS SQL SERVER 2008





如何调用函数Fn_workinghour



请协助





  DECLARE   @ table   AS   TABLE 
startday DATETIME
endday DATETIME

INSERT INTO @ table
SELECT ' 22-Jun-2010 13:00:00 '' 22-Jun-2010 13:15:00'
UNION ALL SELECT ' 2007年6月22日13:00:00'' 23 -Feb-2010 13:15:00'
UNION 所有 SELECT ' 21-Jun-2010 13:00:00'' 23-Jun-2010 13:00:00'

SELECT dbo.fn_workinghour(startday,endday) FROM @table







------------- -------------------------------------------------- ------------

------------------------------ -----------------------------------------------





  alter  功能 Fn_workinghour( @start_date   DATETIME 
@ end_date DATETIME
RETURNS DECIMAL 10 2
AS
BEGIN
DECLARE @ work_calender AS TABLE
[day_number] [ VARCHAR ]( 50 ),
[day_name] [ VARCHAR ]( 50 ),
[begin_time] [ DATETIME ],
[end_time] [ DATETIME ],
[持续时间] [ REAL ])

INSERT INTO @ work_calender
SELECT 1
' Monday'
' 7:00:00 AM'
' 6:00:00 PM'
39600
UNION ALL
< span class =code-keyword> SELECT 2
' < span class =code-string> Tuesday',
' 7:00:00 AM'
' 6:00:00 PM'
39600
UNION ALL
SELECT 3
' Wednesday'
' 7:00:00 AM'
' 6:00:00 PM'
39600
UNION ALL
SELECT 4
' Thursday'
' 7:00:00 AM'
' < span class =code-string> 6:00:00 PM',
39600
UNION ALL
SELECT 5
' Friday'
' 7:00:00 AM'
' 6:00:00 PM'
39600
UNION ALL
SELECT 6
' 星期六'
' 8:00:00 AM'
' 1:00:00 PM'
18000
UNION ALL
SELECT 7
' 星期日'
' 12:00:00 AM'
' 12:00:00 AM'
0

DECLARE @ total_hours DECIMAL 10 2

SELECT @ total_hours = SUM( CASE
WHEN Dateadd(DAY,Datediff(DAY, 0 @ start_date
),
0
=
Dateadd(DAY,Datediff(DAY, 0
@ end_date ), 0 那么
Datediff(SECOND, @ start_date @ end_date
< span class =code-keyword> WHEN [ DATE ] = Dateadd(DAY,Datediff(DAY, 0
@ start_date ), 0
那么
CASE
WHEN
@ start_date > [ DATE ] + begin_time 那么
Datediff(SECOND, @start_date ,[ DATE ] +
end_time)
ELSE duration
END
WHEN [ DATE ] = Dateadd(DAY,Datediff(DAY, 0
@ end_date ), 0
那么
CASE
WHEN
@ end_date < [ DATE ] + end_time 那么
Datediff(SECOND,[ DATE ] + begin_time,
@ end_date
ELSE duration
END
ELSE 持续时间
END )/ 60 0 / 60 0
FROM F_table_date( @ start_date @ end_date )d
INNER JOIN @ work_calender c
ON d.weekday_name_long = c.day_name

RETURN @ total_hours
END





我的尝试:



这是一个正在建设中的程序

解决方案

< blockquote> SQL查询看起来很好,它应该返回@table中每行的总小时数。你没有提到问题是什么。我猜这个查询会抛出错误无效的对象名称'F_table_date'。?



如果是这种情况,如果仔细观察,Fn_workinghour函数指的是另一个表值函数,即F_table_date。您需要运行SQL脚本才能在数据库环境中创建该功能。这是脚本 F_TABLE_DATE.sql

[ ^ ]。



希望是这个问题。


MS SQL SERVER 2008


How do I call the function Fn_workinghour

Please assist


DECLARE @table AS TABLE(
startday DATETIME,
endday DATETIME)

INSERT INTO @table
          SELECT '22-Jun-2010 13:00:00', '22-Jun-2010 13:15:00'
UNION ALL SELECT '22-Jun-2007 13:00:00', '23-Feb-2010 13:15:00'
UNION ALL SELECT '21-Jun-2010 13:00:00', '23-Jun-2010 13:00:00'

SELECT dbo.fn_workinghour(startday, endday) FROM @table




---------------------------------------------------------------------------
-----------------------------------------------------------------------------


alter FUNCTION Fn_workinghour (@start_date DATETIME,
@end_date DATETIME)
RETURNS DECIMAL(10, 2)
AS
BEGIN
DECLARE @work_calender AS TABLE (
[day_number] [VARCHAR] (50),
[day_name] [VARCHAR] (50),
[begin_time] [DATETIME],
[end_time] [DATETIME],
[duration] [REAL] )

INSERT INTO @work_calender
SELECT 1,
'Monday',
'7:00:00 AM',
'6:00:00 PM',
39600
UNION ALL
SELECT 2,
'Tuesday',
'7:00:00 AM',
'6:00:00 PM',
39600
UNION ALL
SELECT 3,
'Wednesday',
'7:00:00 AM',
'6:00:00 PM',
39600
UNION ALL
SELECT 4,
'Thursday',
'7:00:00 AM',
'6:00:00 PM',
39600
UNION ALL
SELECT 5,
'Friday',
'7:00:00 AM',
'6:00:00 PM',
39600
UNION ALL
SELECT 6,
'Saturday',
'8:00:00 AM',
'1:00:00 PM',
18000
UNION ALL
SELECT 7,
'Sunday',
'12:00:00 AM',
'12:00:00 AM',
0

DECLARE @total_hours DECIMAL(10, 2)

SELECT @total_hours = SUM(CASE
WHEN Dateadd(DAY, Datediff(DAY, 0, @start_date
),
0)
=
Dateadd(DAY, Datediff(DAY, 0,
@end_date), 0) THEN
Datediff(SECOND, @start_date, @end_date)
WHEN [DATE] = Dateadd(DAY, Datediff(DAY, 0,
@start_date), 0
) THEN
CASE
WHEN
@start_date > [DATE] + begin_time THEN
Datediff(SECOND, @start_date, [DATE] +
end_time)
ELSE duration
END
WHEN [DATE] = Dateadd(DAY, Datediff(DAY, 0,
@end_date), 0)
THEN
CASE
WHEN
@end_date < [DATE] + end_time THEN
Datediff(SECOND, [DATE] + begin_time,
@end_date)
ELSE duration
END
ELSE duration
END) / 60.0 / 60.0
FROM F_table_date(@start_date, @end_date) d
INNER JOIN @work_calender c
ON d.weekday_name_long = c.day_name

RETURN @total_hours
END



What I have tried:

This is a program under construction

解决方案

The SQL queries look fine and it should return the total hours for each row in the @table. You didn't mention what was the issue. I'm guessing the query is throwing the error "Invalid object name 'F_table_date'."?

If that the case, if you look closely, the Fn_workinghour function is referring to another table value function, namely "F_table_date". You need to run a SQL script to create that function in your database environment. Here is the script F_TABLE_DATE.sql
[^] .

Hopefully, that the issue.


这篇关于如何在ms SQL server 2008中调用函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆