1

我有一个字符串变量,它填充了日历中的日期,格式为 29/07/2012

我想将其转换为日期时间数据类型,然后以这种格式 2012-07-29 00:00:00:000 将其存储在 sql 数据库中

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 日8 月 7 日,取决于文化),这很可能会失败,因此使用ParseExactTryParseExact使用确切的格式字符串(和文化)可能是一个更强大的解决方案。

这可以使用任何常用方式(ADO.NET、像 nHibernate 或 EF 之类的 ORM)直接馈入 SQL Server。

在 SQL Server 中以某种格式存储 s的问题存在误解DATETIME——它们不是。它们有一个不可见的内部表示 - 您看到的是 SSMS 将值格式化为您所看到的。

于 2012-08-02T10:52:16.070 回答
0

您将不得不使用DateTime.TryParseExact将它获取到一个DateTime对象中,然后将其作为参数存储在您的SqlCommand.

于 2012-08-02T10:49:52.440 回答
0
Dim dt As DateTime
dt = Convert.ToDateTime(TextBox1.Text)

但我认为您应该使用日期格式为 MM/DD/YYYY(07/29/2012 而不是 29/07/2012)

于 2012-08-02T10:58:43.793 回答