0

以下が機能しない理由を誰でも知っています:

[WebMethod()]
public double GetDayCount(string strMeetingDate, string strMeetingTime)
{
    string[] strStartDateParts = strMeetingDate.Split('-');

    // change DMY to YMD
    strMeetingDate = strStartDateParts[2] + '-' + strStartDateParts[1] + '-' + strStartDateParts[0];

    using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
    {

        using (command = new SqlCommand("BusinessHours", connection))
        {

            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add("@meeting_day", SqlDbType.DateTime).Value = strMeetingDate;
            command.Parameters.Add("@meeting_time", SqlDbType.DateTime).Value = strMeetingTime;

            connection.Open();

            using (reader = command.ExecuteReader())
            {
                reader.Read();
                return (double)reader["hours"];
            }
        }
    }
}

エラー メッセージは返されませんが、返される値は正しくありません。


完全なストアド プロシージャを次に示します。

USE [INTRANET]
GO
/****** Object:  StoredProcedure [dbo].[BusinessHours]    Script Date: 06/24/2013 11:38:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[BusinessHours]

@meeting_day DATETIME,
@meeting_time DATETIME

AS

DECLARE @submit_day DATETIME;
DECLARE @submit_time DATETIME;

DECLARE @start_time_of_business_day DATETIME;
DECLARE @business_day_hours FLOAT;

DECLARE @num1 FLOAT
DECLARE @num2 FLOAT
DECLARE @num3 FLOAT

SET @submit_day = CONVERT(VARCHAR(10),GETDATE(),101);
SET @submit_time =  CONVERT(VARCHAR(8),GETDATE(),108);

SET @start_time_of_business_day = '09:00';
SET @business_day_hours = 8.5;

SET @num1 = ((DATEDIFF(dd, @submit_day, @meeting_day))
-(DATEDIFF(wk, @submit_day, @meeting_day) * 2)
-(CASE WHEN DATEPART(dw, @submit_day) = 1 THEN 1 ELSE 0 END)
-(CASE WHEN DATEPART(dw, @meeting_day) = 7 THEN 1 ELSE 0 END)
-(SELECT COUNT(*) FROM bank_holiday WHERE the_date BETWEEN @submit_day AND @meeting_day)) * @business_day_hours
SET @num2 = (select datediff(minute, @start_time_of_business_day, @submit_time)) / 60.0
SET @num3 = (select datediff(minute, @start_time_of_business_day, @meeting_time)) / 60.0

select @num1 - @num2 + @num3 as [hours]

ストアド プロシージャを手動で実行すると (SQL Server Management Studio 内からストアド プロシージャ名をクリックして [実行] を選択して実行する場合と同様)、0.666667 が返されます (値は現在の日付/時刻と入力された日付/時刻によって異なります)。ストアド プロシージャに)。しかし、.asmx ファイルを実行すると、994728.666667 が返されます。

なぜこれが起こっているのか知っている人はいますか?基本的に、両方の例で .666667 の部分は正しいのですが、何らかの理由で .asmx ファイルは正しい値に 994728 を追加しているようです。

4

2 に答える 2

1

文字列を DateTime パラメーターとして渡しています。以下が機能するはずです。

[WebMethod()]
public double GetDayCount(string strMeetingDate, string strMeetingTime)
{
    string[] strStartDateParts = strMeetingDate.Split('-');
    // not sure what your expected time format is
    string[] srtStartTimeParts = strMeetingTime.Split('-');

    int year = Int32.Parse(strStartDateParts[2]);
    int month = Int32.Parse(strStartDateParts[1]);
    int day = Int32.Parse(strStartDateParts[0]);
    int hour = Int32.Parse(srtStartTimeParts[0]);
    int min = Int32.Parse(srtStartTimeParts[1]);
    int sec = Int32.Parse(srtStartTimeParts[2]);

    DateTime meetingDate = new DateTime(year, month, day, hour, min, sec);
     using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
    {
         using (command = new SqlCommand("BusinessHours", connection))
        {
             command.CommandType = CommandType.StoredProcedure;
             command.Parameters.Add("@meeting_date", SqlDbType.DateTime).Value = meetingDate;
             connection.Open();
             using (reader = command.ExecuteReader())
            {
                reader.Read();
                return (double)reader["hours"];
            }
        }
    }
}

次に、引数から日付と時刻を解析するように sproc を変更します。

ALTER PROCEDURE [dbo].[BusinessHours]

@meeting_date DATETIME

AS

DECLARE @meeting_day DATETIME
DECLARE @meeting_time DATETIME
DECLARE @submit_day DATETIME;
DECLARE @submit_time DATETIME;

DECLARE @start_time_of_business_day DATETIME;
DECLARE @business_day_hours FLOAT;

DECLARE @num1 FLOAT
DECLARE @num2 FLOAT
DECLARE @num3 FLOAT

SET @meeting_day = CONVERT(VARCHAR(10),@meeting_date,101);
SET @meeting_time =  CONVERT(VARCHAR(8),@meeting_date,108);

SET @submit_day = CONVERT(VARCHAR(10),GETDATE(),101);
SET @submit_time =  CONVERT(VARCHAR(8),GETDATE(),108);

SET @start_time_of_business_day = '09:00';
SET @business_day_hours = 8.5;

SET @num1 = ((DATEDIFF(dd, @submit_day, @meeting_day))
-(DATEDIFF(wk, @submit_day, @meeting_day) * 2)
-(CASE WHEN DATEPART(dw, @submit_day) = 1 THEN 1 ELSE 0 END)
-(CASE WHEN DATEPART(dw, @meeting_day) = 7 THEN 1 ELSE 0 END)
-(SELECT COUNT(*) FROM bank_holiday WHERE the_date BETWEEN @submit_day AND @meeting_day)) * @business_day_hours
SET @num2 = (select datediff(minute, @start_time_of_business_day, @submit_time)) / 60.0
SET @num3 = (select datediff(minute, @start_time_of_business_day, @meeting_time)) / 60.0

select @num1 - @num2 + @num3 as [hours]
于 2013-06-26T18:53:59.587 に答える