1

この形式のカレンダーからの日付が入力される文字列変数があります 29/07/2012

これを 2012-07-29 00:00:00:000 の形式で SQL データベースに格納する前に、これを datetime データ型に変換したい

The error message i'm getting at the minute is:
"The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value."

ここにいくつかのコードがあります:

Dim strDate As String = ""

 Dim cmd2 As New SqlCommand("sp_Return6MonthTotal")
                Dim strTotalHours6Month As Integer = 0
                cmd2.Connection = con1
                cmd2.CommandType = Data.CommandType.StoredProcedure
                cmd2.Parameters.Add(New SqlParameter("@ServiceNumber", Data.SqlDbType.Char, 11))
                cmd2.Parameters.Add(New SqlParameter("@OvertimeDate2", Data.SqlDbType.DateTime))
                cmd2.Parameters("@ServiceNumber").Value = strServiceNumber
                cmd2.Parameters("@OvertimeDate2").Value = strDate

                If cmd2.ExecuteScalar() Is DBNull.Value Then
                    Label17.Text = "0"
                    Label21.Text = "0"
                Else
                    strTotalHours6Month = cmd2.ExecuteScalar()
                    Label17.Text = strTotalHours6Month
                    Label21.Text = Math.Round(strTotalHours6Month / 6)
                End If


                Dim cmd3 As New SqlCommand("sp_ReturnMonthTotal")
                Dim strTotalHours As Integer = 0
                cmd3.Connection = con1
                cmd3.CommandType = Data.CommandType.StoredProcedure
                cmd3.Parameters.Add(New SqlParameter("@ServiceNumber", Data.SqlDbType.Char, 11))
                cmd3.Parameters.Add(New SqlParameter("@OvertimeDate2", Data.SqlDbType.DateTime))
                cmd3.Parameters("@ServiceNumber").Value = strServiceNumber
                cmd3.Parameters("@OvertimeDate2").Value = strDate

Stored procedures:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_ReturnMonthTotal]
   @ServiceNumber varchar(100),
   @OvertimeDate2 datetime
AS

SELECT sum(hoursworked) from overtime where servicenumber = @ServiceNumber and month(CONVERT(datetime, OvertimeDate2, 103)) = month(CONVERT(datetime, @OvertimeDate2, 103)) and year(CONVERT(datetime, OvertimeDate2, 103)) = year(CONVERT(datetime, @OvertimeDate2, 103))

-------------
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_Return6MonthTotal]
   @ServiceNumber varchar(100),
   @OvertimeDate2 datetime
AS

SELECT sum(hoursworked) from overtime where servicenumber = @ServiceNumber and overtimedate2 >= DATEADD(month, -6, CONVERT(datetime, @OvertimeDate2, 103))

申し訳ありませんが、私のプログラミング知識はそれほど大きくなく、これをコーディングしていないので、これが誰かにとって意味があることを願っています.

4

4 に答える 4

2

以下のようなコードを歌って日付を変換し、それをデータベースに送信してその値を保存してみてください

vb.net

Dim strDate As String = "21/07/2006"
Dim dtfi As New DateTimeFormatInfo()
dtfi.ShortDatePattern = "dd/MM/yyyy"
dtfi.DateSeparator = "/"
Dim objDate As DateTime = Convert.ToDateTime(strDate, dtfi)

c#(参照)

 string strDate = "21/07/2006";
 DateTimeFormatInfo dtfi = new DateTimeFormatInfo();
 dtfi.ShortDatePattern = "dd/MM/yyyy";
 dtfi.DateSeparator = "/";
 DateTime objDate = Convert.ToDateTime(strDate, dtfi);
于 2012-08-02T10:51:45.557 に答える
1

DateTime.Parse("29/07/2012")問題なくタイプに解析されDateTimeます。文字列があいまいな場合 ("08/07/2012" は、カルチャによっては 7月 8 日またはParseExact8 月 7 日になる可能性があります)、これは非常によく失敗する可能性があるため、正確な書式文字列 (およびカルチャ) でorTryParseExactを使用すると、より堅牢なソリューションになる可能性があります。

これは、一般的な方法 (ADO.NET、nHibernate や EF などの ORM) のいずれかを使用して、SQL Server に直接供給することができます。

DATETIMEs が SQL Server の形式で格納されているという質問には誤解がありますが、そうではありません。それらには表示されない内部表現があります-表示されるのは、SSMSが表示する値にフォーマットすることです。

于 2012-08-02T10:52:16.070 に答える
0
Dim dt As DateTime
dt = Convert.ToDateTime(TextBox1.Text)

ただし、日付形式はMM / DD / YYYYとして使用する必要があると思います(2012年7月29日ではなく2012年7月29日)

于 2012-08-02T10:58:43.793 に答える
0

を使用DateTime.TryParseExactしてオブジェクトで取得し、それをDateTimeパラメーターとして に保存する必要がありますSqlCommand

于 2012-08-02T10:49:52.440 に答える