字符串到日期格式

时间:2016-06-15 07:28:54

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

我有一个jQuery calender,其值为ASP Textbox(通过日历不可编辑的栏)

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

我需要将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#

3 个答案:

答案 0 :(得分:2)

1。启用Option Strict

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纳秒单位测量,特定日期是格里高利历日历中自公元0001年1月1日午夜12:00起的刻度数(不包括将添加的刻度)闰秒)。例如,刻度值31241376000000000L表示日期,星期五,1月01日,0100 12:00:00午夜。

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

日期可以在查询中用作 Datetime类型,大多数DBProviders都能够传递数据并转换为存储 - 这就是它的工作。这假设db列也是日期类型。

3。调试器使用Invariant Culture

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, 1944Dim SQL = <sql> Select ... WHERE 1 = 1 And d.SurveyDate between @p1 AND @p2 AND #fld1 = @p3 AND #fld2 = @p4" </sql>.Value 都是同一时刻。两者都有相同的含义。

4。始终使用SQL参数

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

Date

对于复杂查询,您可以使用XML文字,以便格式化查询以使其更具可读性。对于刻度和字符串连接或延续没有旋转,并且没有机会意外地将integerString.Replace转换为带有额外刻度的文本,而不需要它们。

您不能将参数用于列名称。因此,如果您需要提供这些,我会在创建SQL时添加它们,但您也可以使用' no idea what these are, probably need .ToString for Option Strict SQL = SQL.Replace("#fld1", d.Field1).Replace("#fld2", d.Field3)

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

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

xxxDbType

请务必使用正确的类型作为Date:许多数据库提供的DateTime项目只会传递 日期,dtFrom.Date将包括在BETWEEN查询中通常不需要的时间元素。仅传递日期(dtTarget > @p1 AND dtTarget < @p2)也可以确保这一点。

您可能需要阅读 What do BETWEEN and the devil have in common? ,这解释了为什么您可能想要使用&#34; DBContext&#34;查询而不是BETWEEN。

答案 1 :(得分:1)

仅将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

答案 2 :(得分:0)

尝试使用<?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="right" > <Switch android:id="@+id/switch1" android:layout_width="wrap_content" android:layout_height="match_parent"/> <ImageButton android:id="@+id/action_starred" android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:attr/actionButtonStyle" android:src="@android:drawable/ic_menu_compass" android:onClick="FakeMenu"/> </LinearLayout> //Then put these lines of code in your java class or activity ActionBar actionBar = getActionBar(); actionBar.setCustomView(R.layout.actionbar); //load your layout actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME|ActionBar.DISPLAY_SHOW_USTOM); //show it 将文本转换为日期:

DateTime.ParseExact

您可以使用以下方法将其解析为文本:

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

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

此处提供更多信息:Why do we always prefer using parameters in SQL statements?
有关ParseExact的更多信息,请参见MSDN