【问题标题】:How to set date format from VB.NET form如何从 VB.NET 表单设置日期格式
【发布时间】:2013-09-01 01:13:06
【问题描述】:

我有一个 VB.NET 表单,可以将用户的选择传递给我的数据库 (SQL Server 2008)。用户选择的值之一是来自日期选择器对象的日期。该日期以字符串形式存储在数据库中。
我注意到在不同的部署中,插入数据库的日期格式是不同的,并且取决于服务器上设置的数据格式。

这对我来说可能是一个真正的问题,因为我需要在多台服务器上安装我们的流程(针对不同的客户端),而且我不一定可以选择更改服务器的日期格式。

有没有办法以编程方式定义输出到数据库的日期格式?

【问题讨论】:

    标签: sql-server vb.net winforms


    【解决方案1】:

    如果您使用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'
    

    【讨论】:

    • 我可以在不传递时间值的情况下执行此操作吗?
    • 更新为显示上午/下午或军事时间。是的,只需删除您不想要的项目的字母。如果您只想要日期,请使用 Date.Now.ToString("MM/dd/yyyy")
    【解决方案2】:

    数据库中的日期格式不会以它们在 Management Studio 或其他客户端工具中呈现给您的方式存储(由于您的区域设置或其他设置,它们可能会应用区域格式)。

    如果您在数据库中存储日期/时间值,您的数据类型应该是DATEDATETIMESMALLDATETIME 等,而不是像VARCHARNVARCHAR 这样的字符串类型。当您将日期存储为字符串时,您将失去各种功能:自动验证(垃圾预防)、日期/时间数学、有效的日期范围查询等。如果您将 01/06/2013 填充在字符串列中,那么任何人都知道您是否是指 1 月 6 日还是 6 月 1 日?您希望如何对这样的字符串进行排序?

    您的 VB.NET 表单应该传递一个日期时间参数,并且格式不应该是它的一部分。日期/时间值不应被视为字符串,除非您需要将其呈现给用户,在这种情况下,您应该在呈现层中使用.Format().ToString()。 p>

    如果您绝对必须传递一个字符串,请确保它采用绝对明确的格式,例如以下日期时间:

    YYYYMMDD hh:mm:ss.nnn
    YYYY-MM-DDThh:mm.ss.nnn
    

    根据语言、日期格式和其他设置,其他格式可能会被错误解释。但是您不必担心这一点,因为您应该将日期/时间值作为日期/时间参数而不是字符串传递。

    【讨论】:

      【解决方案3】:

      我相信对您的问题的最佳回答是:不要那样做。数据库中的日期应该是日期,日期时间应该是日期时间,整数应该是整数或大整数等等。

      我想不出一个将日期存储为字符串的糟糕理由,更不用说一个好的理由了。

      如果您将日期存储为字符串,请停止这样做。如果您将日期存储为日期,但传入一个字符串,请停止这样做 - 切换到 sql 参数。

      【讨论】:

        【解决方案4】:

        如果我错了,请纠正我,你想设置 datetimepicker 常量的格式。

        这里是代码。

        Me.DateTimePicker1.Format = DateTimePickerFormat.Custom
        Me.DateTimePicker1.CustomFormat = "dd/MM/yyyy"
        

        您也可以将其设置为小时和秒。

        输出:

        30/08/2013
        

        它将始终采用与您将其保存到数据库或检索它的格式相同的格式。

        【讨论】:

        • 感谢您的信息,但这不是我需要的。
        【解决方案5】:

        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
        

        【讨论】:

          【解决方案6】:

          数据库中的日期格式在数据库配置中设置。

          当您查询数据时,您可以按如下所示格式化日期: http://msdn.microsoft.com/en-us/library/ms187928.aspx

          另外,看看这个:http://technet.microsoft.com/en-us/library/ms189491.aspx

          【讨论】:

            猜你喜欢
            • 2015-02-25
            • 1970-01-01
            • 2015-05-23
            • 1970-01-01
            • 1970-01-01
            • 2021-07-01
            • 2014-06-02
            • 1970-01-01
            • 2021-06-26
            相关资源
            最近更新 更多