我有一个 VB.NET 表单,可以将用户的选择传递给我的数据库(SQL Server 2008)。用户选择的值之一是来自日期选择器对象的日期。该日期作为字符串存储在数据库中。
我注意到在不同的部署中,插入数据库的日期格式是不同的,它取决于服务器上设置的数据格式。
这对我来说可能是一个真正的问题,因为我需要在多台服务器(针对不同的客户端)上安装我们的进程,而且我不一定可以选择更改服务器的日期格式。
有没有办法以编程方式定义输出到数据库的日期格式?
我有一个 VB.NET 表单,可以将用户的选择传递给我的数据库(SQL Server 2008)。用户选择的值之一是来自日期选择器对象的日期。该日期作为字符串存储在数据库中。
我注意到在不同的部署中,插入数据库的日期格式是不同的,它取决于服务器上设置的数据格式。
这对我来说可能是一个真正的问题,因为我需要在多台服务器(针对不同的客户端)上安装我们的进程,而且我不一定可以选择更改服务器的日期格式。
有没有办法以编程方式定义输出到数据库的日期格式?
如果您使用DateTime
字段类型将日期和时间信息存储到 SQL,则 SQL 应自动将其转换为用于存储这些值的格式 (YYYY-MM-DD hh:mm:ss)。
另一方面,如果您将它们存储为文本(varchar 等),那么您将不得不修改代码以按照您想要的方式传递日期和时间。
也许是这样的:
Dim strDate as string = Date.Now.ToString("MM/dd/yyyy hh:mm:ss tt") 'Returns date with AM/PM'
Dim strDate as string = Date.Now.ToString("MM/dd/yyyy HHH:mm:ss") 'Returns date with military time'
数据库中的日期格式不会以它们在 Management Studio 或其他客户端工具中呈现给您的方式存储(由于您的区域设置或其他设置,它们可能会应用区域格式)。
如果您在数据库中存储日期/时间值,您的数据类型应该是DATE
, DATETIME
,SMALLDATETIME
等,而不是像VARCHAR
or之类的字符串类型NVARCHAR
。当您将日期存储为字符串时,您会失去各种功能:自动验证(垃圾预防)、日期/时间数学、有效的日期范围查询等。如果您将日期存储01/06/2013
在字符串列中,那么任何人都知道您的意思是 1 月 6 日还是 6 月 1 日?您希望如何对这样的字符串进行排序?
您的 VB.NET 表单应该传递一个日期时间参数,并且格式不应该是其中的一部分。日期/时间值不应被视为字符串,除非您需要将其呈现给用户,在这种情况下您应该使用.Format()
或.ToString()
在表示层中。
如果您绝对必须传递一个字符串,请确保它采用绝对明确的格式,例如以下日期时间:
YYYYMMDD hh:mm:ss.nnn
YYYY-MM-DDThh:mm.ss.nnn
根据语言、日期格式和其他设置,其他格式可能会被错误解释。但是您不必担心这一点,因为您应该将日期/时间值作为日期/时间参数而不是字符串传递。
我相信您问题的最佳答案是:不要那样做。数据库中的日期应该是日期,日期时间应该是日期时间,整数应该是整数或大整数等等。
我想不出将日期存储为字符串的糟糕理由,更不用说一个好的理由了。
如果您将日期存储为字符串,请停止这样做。如果您将日期存储为日期,但传入一个字符串,请停止这样做——切换到 sql 参数。
如果我错了,请纠正我,你想设置 datetimepicker 常量的格式。
这是代码。
Me.DateTimePicker1.Format = DateTimePickerFormat.Custom
Me.DateTimePicker1.CustomFormat = "dd/MM/yyyy"
您也可以将其设置为小时和秒。
输出:
30/08/2013
它将始终采用与您将其保存到数据库或检索它的格式相同的格式。
Private Sub Button2_Click(sender As Object, e As EventArgs) 处理 Button2.Click
Dim strtdate As String
Dim enddate As String
strtdate = DateTimePicker1.Value.ToString("yyyy-MM-dd")
enddate = DateTimePicker2.Value.ToString("yyyy-MM-dd")
'MsgBox(strtdate)
Using con As New SqlConnection(connectionString)
Using cmd As SqlCommand = con.CreateCommand()
cmd.CommandText = "SELECT * FROM CleanData where Notice_Date between @noticestartdate and @noticeenddate order by Notice_Date"
cmd.Parameters.AddWithValue("@noticestartdate", strtdate)
cmd.Parameters.AddWithValue("@noticeenddate", enddate)
cmd.CommandType = CommandType.Text
Using sda As New SqlDataAdapter(cmd)
Using dt As New DataTable()
sda.Fill(dt)
DataGridView1.DataSource = dt
End Using
End Using
End Using
End Using
End Sub
数据库中的日期格式在数据库配置中设置。
当您查询数据时,您可以按此处所示格式化日期:http: //msdn.microsoft.com/en-us/library/ms187928.aspx
另外,看看这个:http ://technet.microsoft.com/en-us/library/ms189491.aspx