【问题标题】:String To Date format字符串到日期格式
【发布时间】:2016-06-15 07:28:53
【问题描述】:

我有一个jQuery calender,它在ASP Textbox 中有值(不能通过日历编辑栏)

两个日历创建一个从和到日期。 (包括默认值)

我需要将stringdd/mm/yyyy 转换为yyyy-MM-dd,但尽管尝试了各种堆栈想法,但仍低于错误-

错误:转换日期和/或时间时失败 人物

代码:

 Dim vDateFrom As Date = sDateFrom.Text
        vDateFrom = vDateFrom.ToString("yyyy-MM-dd")
        Dim vDateTo As Date = sDateTo.Text
        vDateTo = vDateTo.ToString("yyyy-MM-dd")

如果我用以下内容覆盖上面的内容,它运行的SQL 可以工作:

vDateFrom = 2016-03-01
 vDateTo = 2016-06-01

当我调试时,日期仍然是dd/mm/yyyy,即#6/15/2016 12:00:00 AM#

我还包含了 SQL 字符串行(测试),我可以在那里简单地更改日期。

Using command As New SqlCommand("Select COUNT(d.ID) FROM TblData As D  JOIN TBLPROPERTYLIST As p On d.UPRN = p.UPRN WHERE 1 = 1 And d.SurveyDate between '" & vDateFrom.ToString & "' AND '" & vDateTo.ToString & "' And d.Field1 = " & i & " And d.Field2 = " & j & "" & vString & "", connection)

注意事项:

查看了其他内容:

-添加 CDate 以及

-datetime format to SQL format using C#

【问题讨论】:

  • 您应该使用 sql 命令中的参数。这可能会解决问题。
  • 你不应该依赖文化相关的日期时间格式。如果你真的需要,你可以read this。但无论如何,您的查询应该将值插入为 parameter。像你在这里做的那样连接查询是非常糟糕的习惯......
  • 我应该注意SQL是在.aspx.vb的页面上
  • 将数据存储在DateDateTime 变量中后,请继续使用 datetime 类型。是您坚持要返回 strings 导致您的格式问题。正如标准具所说,使用参数,以便 ADO.Net 可以在 VB.Net 中获取您的 DateTime 值,并将它们直接转换为 SQL Server 中的 datetime 值。
  • 日期没有格式。 NET 提供程序完全能够使用参数将 DateTime 变量传递给 DB,而完全没有任何旋转。如果 db 列也是 Date 类型,它们将正常工作。此外,您应该打开 Option Strict - 其中一些代码将无法编译。

标签: .net sql-server vb.net datetime


【解决方案1】:

1。开启选项严格

Dim vDateFrom As Date = sDateFrom.Text
' or:
vDateFrom = "2016-03-01" 

这样的代码将无法编译:您不能将字符串分配给日期,反之亦然。它们是两种不同的东西。在大多数情况下,应该将字符串解析为 DateTime 类型。

2。日期没有格式

I need to convert the string from dd/mm/yyyy to yyyy-MM-dd

不,你没有。日期没有格式。 MSDN explains that a DateTime 只是一个值:

表示时间的瞬间,通常表示为日期和时间。

在备注中:

时间值以 100 纳秒为单位(称为滴答声)测量,特定日期是公历中自公元 01 年 1 月 1 日午夜 12:00 开始的滴答声(不包括将添加的滴答声)闰秒)。例如,刻度值 31241376000000000L 表示日期,即 0100 年 1 月 1 日星期五午夜 12:00:00。

任何格式都是该瞬间如何表达和显示给人类 - 这通常涉及将日期更改为字符串 - 所以它是字符串/文本而不是具有格式的日期。这意味着您只有在将字符串传递到数据库时需要担心格式(应该避免这种情况)。

日期可以在查询中使用作为 Datetime 类型,大多数 DBProvider 都非常有能力传递数据并转换为存储方式 - 这是它的工作。这假设 db 列也是日期类型。

3。调试器使用不变文化

When I debug it appears the date is still dd/mm/yyyy i.e. #6/15/2016 12:00:00 AM#

VB IDE 以您在定义日期文字时必须使用的相同格式向您显示日期:dd/MM/yyyy。这是为了消除歧义并保持一致。

日期没有格式,所以#6/4/1944# 是同一时刻,无论是以这种方式显示还是June 4, 1944。两者含义相同。

4。始终使用 SQL 参数

这不仅可以防止 SQL 注入攻击,还可以使您的代码更易于阅读并防止不需要的类型转换。

Dim SQL = <sql>
          Select ...  
          WHERE 1 = 1 And d.SurveyDate between @p1 AND @p2 
          AND #fld1 = @p3 AND #fld2 = @p4"
      </sql>.Value

对于复杂的查询,您可以使用 XML 文字,这样您就可以格式化查询以使其更具可读性。刻度和字符串连接或延续没有旋转,也没有机会意外地将 Dateinteger 转换为不需要额外刻度的文本。

您不能对列名使用参数。所以如果你需要提供这些,我会在创建 SQL 时添加它们,但你也可以使用String.Replace:

' no idea what these are, probably need .ToString for Option Strict
SQL = SQL.Replace("#fld1", d.Field1).Replace("#fld2", d.Field3)

然后,通过参数提供变量(这里使用MySql):

Using cmd As New MySqlCommand(SQL, connection)
    cmd.Parameters.Add("@p1", MySqlDbType.Date).Value = dtFrom.Date
    cmd.Parameters.Add("@p2", MySqlDbType.Date).Value = dtTo.Date
    cmd.Parameters.Add("@p3", MySqlDbType.Int32).Value = i
    cmd.Parameters.Add("@p3", MySqlDbType.Int32).Value = j
    ...
End Using

确保使用正确的类型作为xxxDbType:许多数据库提供了一个Date 项目,它将传递日期,而DateTime 将包括时间元素,这通常是在 BETWEEN 查询中不需要。仅传递日期 (dtFrom.Date) 也可以确保这一点。


您可能想阅读 What do BETWEEN and the devil have in common?,它解释了为什么您可能希望使用“dtTarget &gt; @p1 AND dtTarget &lt; @p2”查询而不是 BETWEEN。

【讨论】:

    【解决方案2】:

    只将String 转换为Date 一次。并使用Date 类型的变量进行Sql 查询。
    使用SqlParameter 将值传递给sql查询,使用参数可以避免各种格式问题,还可以防止Sql注入。
    始终使用SqlParameter

    使用Date.ParseExactstring 转换为Date

    Dim provider As CultureInfo = 
        System.Globalization.CultureInfo.InvariantCulture
    Dim format As String = "dd/MM/yyyy"
    
    Dim dateFrom As Date = Date.ParseExact(sDateFrom.Text, format, provider)
    Dim dateTo As Date = Date.ParseExact(sDateTo.Text, format, provider)
    

    然后在带参数的Sql查询中使用转换后的值

    Dim query As String = 
        "Select COUNT(d.ID) FROM TblData As D
         JOIN TBLPROPERTYLIST As p On d.UPRN = p.UPRN
         WHERE d.SurveyDate between @DateFrom AND @DateTo"
    
    Dim parameters As SqlParameter() = 
    {
        New SqlParameter With {.ParameterName = "@DateFrom", 
                               .SqlDbType = SqlDbType.DateTime,
                               .Value = dateFrom},
        New SqlParameter With {.ParameterName = "@DateTo", 
                               .SqlDbType = SqlDbType.DateTime,
                               .Value = dateTo}
    }
    Using command As New SqlCommand(query, connection)
        command.Parameters.AddRange(parameters)
        'Execute command
    End Using
    

    【讨论】:

      【解决方案3】:

      尝试使用DateTime.ParseExact 将文本转换为日期:

      Dim myDate As DateTime
      myDate = DateTime.ParseExact(sDateTxt, "dd/MM/yyyy", CultureInfo.InvariantCulture)
      

      您可以将其解析为文本:

      Dim result As String = myDate.ToString("yyyy-MM-dd")
      

      但我建议您不要这样做,以便在 DateBase 中插入值。您应该使用替代参数来避免 SQL 注入攻击。

      更多信息在这里:Why do we always prefer using parameters in SQL statements?
      MSDN 中有关 ParseExact 的更多信息。

      【讨论】:

      • 同样,一旦你有了一个完全可用的DateTime 值,将它转换回字符串所做的就是引入出现格式问题的机会。
      • 为什么投反对票?答案有问题吗?
      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多