我有一个jQuery calender
,其值为ASP Textbox
(通过日历不可编辑的栏)
两个日历创建一个From和To日期。 (包括默认值)
我需要将string
从dd/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以及
答案 0 :(得分:2)
Dim vDateFrom As Date = sDateFrom.Text
' or:
vDateFrom = "2016-03-01"
此类代码将无法编译:您无法将字符串分配给日期,反之亦然。它们是两个不同的东西。在大多数情况下,字符串应该被解析为DateTime
类型。
I need to convert the string from dd/mm/yyyy to yyyy-MM-dd
表示即时时间,通常表示为日期和时间。
备注:
时间值以称为刻度线的100纳秒单位测量,特定日期是格里高利历日历中自公元0001年1月1日午夜12:00起的刻度数(不包括将添加的刻度)闰秒)。例如,刻度值31241376000000000L表示日期,星期五,1月01日,0100 12:00:00午夜。
任何格式都是这个瞬间如何表达并向人类显示 - 这通常涉及将日期更改为字符串 - 所以它是字符串/文本而不是具有格式的日期。这意味着仅在将字符串传递给数据库时必须担心格式(应该避免)。
日期可以在查询中用作 Datetime
类型,大多数DBProviders都能够传递数据并转换为存储 - 这就是它的工作。这假设db列也是日期类型。
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
,Dim SQL = <sql>
Select ...
WHERE 1 = 1 And d.SurveyDate between @p1 AND @p2
AND #fld1 = @p3 AND #fld2 = @p4"
</sql>.Value
都是同一时刻。两者都有相同的含义。
这不仅可以防止SQL注入攻击,还可以让您的代码更易于阅读并防止意外的类型转换。
Date
对于复杂查询,您可以使用XML文字,以便格式化查询以使其更具可读性。对于刻度和字符串连接或延续没有旋转,并且没有机会意外地将integer
或String.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.ParseExact
将string
转换为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。