我有一张表格,其中记录了数据&y; / MM / dd HH:mm:ss'格式和我的区域设置是' 2016-04-02 14:25:15'类型。我想在以下查询中获取详细信息,但不填充任何结果
我使用的查询是
select
Date_time, alarm_id, alarm_message
from
table01
where
Date_time between '" & DateTimePicker5.Value & "' and '" & DateTimePicker6.Value & "'
我也试过使用我编写的一个函数
Private Function FormatDate(ByVal dat As String) As String
Dim FTDate As Date
FTDate = FormatDateTime(Convert.ToDateTime(dat), DateFormat.ShortDate)
FormatDate = Format(FTDate, "yy/MM/dd HH:mm:ss")
End Function
在查询中再次使用相同的
select
Date_time, alarm_id, alarm_message
from
table01
where
Date_time between '" & formatdate(DateTimePicker5.Value) & "' and '" & formatdate(DateTimePicker6.Value) & "'
请建议适当的答案,确保我不想更改我的区域设置和表单加载事件。我已经写了以下代码
DateTimePicker5.Format = DateTimePickerFormat.Custom
DateTimePicker5.CustomFormat = "yy/MM/dd HH:mm:ss"
DateTimePicker6.Format = DateTimePickerFormat.Custom
DateTimePicker6.CustomFormat = "yy/MM/dd HH:mm:ss"
表格是以下面提到的格式
**Datetime V1 P1**
16/08/29 19:12:24 10 STB-1
16/08/29 19:12:19 20 STB-1
16/08/29 19:12:18 30 STB-1
16/08/29 19:09:50 40 STB-1
答案 0 :(得分:1)
永远不会 EVER 使用字符串连接将值放入类似的查询中!它实际上是乞求一天早上醒来,发现你的网站六个月前被黑了。
您需要做的第一件事情是修复架构,以便您的日期值实际存储为DateTime列。这有很多原因,我甚至无法开始描述它们。做吧!
完成后,您可以像这样构建查询:
Const SQL As String = _
"SELECT Date_time, alarm_id, alarm_message " &
" FROM table01" &
" WHERE Date_time between @StartTime AND @EndTime"
嘿,看,它是常量。这不是绝对必要的。我通常只使用正常的Dim
' String值。我想在此证明一点:您的SQL语句设置为使用特定的占位符,从不在任何时候将数据放入其中。您为@StartTime
和@EndTime
值提供的值将完全从SQL命令中分离并隔离,以便不存在注入的可能性。
获得SQL命令字符串后,可以像这样使用它(重复字符串定义,以便所有内容都在一个地方):
Const SQL As String = _
"SELECT Date_time, alarm_id, alarm_message " &
" FROM table01" &
" WHERE Date_time between @StartTime AND @EndTime"
Using cn As New SqlConnection("connection string here"), _
cmd As New SqlCommand(SQL, cn)
cmd.Parameters.Add("@StartTime", SqlDbType.DateTime).Value = DateTimePicker5.Value
cmd.Parameters.Add("@EndTime", SqlDbType.DateTime).Value = DateTimePicker6.Value
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
End While
End Using
End Using
或者,如果您正在填写DataTable:
Dim result As New DataTable
Const SQL As String = _
"SELECT Date_time, alarm_id, alarm_message " &
" FROM table01" &
" WHERE Date_time between @StartTime AND @EndTime"
Using cn As New SqlConnection("connection string here"), _
cmd As New SqlCommand(SQL, cn), _
ad As New SqlDataAdapter(cmd)
cmd.Parameters.Add("@StartTime", SqlDbType.DateTime).Value = DateTimePicker5.Value
cmd.Parameters.Add("@EndTime", SqlDbType.DateTime).Value = DateTimePicker6.Value
ad.Fill(result)
End Using
请注意,使用此方法,您永远不必担心您的DateTime格式。 ADO.Net为您量身定做。它知道.Net DateTime对象,它知道Sql Server DateTime列,它自然地处理这两种类型之间的转换。
答案 1 :(得分:0)
您可以使用转换功能。
select
Date_time, alarm_id, alarm_message
from
table01
where
Convert(Datetime,Date_time) between Convert(Datetime,'" & DateTimePicker5.Value & "') and Convert(Datetime,'" & DateTimePicker6.Value & "')
答案 2 :(得分:0)
这是一个棘手的解决方案。 由于年份在后端保持“yy”,以下是假设。
如果数据库字段的年份部分在00到16之间,则需要将其视为2000到2016.对于剩余的值,脚本将把年份视为1917年到1999年。
您可以尝试使用以下脚本。
SELECT Date_time, alarm_id, alarm_message
FROM table01
WHERE
CASE WHEN LEFT(Date_time,2) between 00 and RIGHT(year(getdate()),2) THEN CONVERT(DATETIME,'20'+Date_time)
ELSE CONVERT(DATETIME,'19'+Date_time) END between '" & DateTimePicker5.Value & "' and '" & DateTimePicker6.Value & "'
答案 3 :(得分:0)
自:
Console.WriteLine(#1/31/2016 10:23:22 AM#.ToString("yy/MM/dd HH:mm:ss"))
返回16/01/31 10:23:22
我想:
select
Date_time, alarm_id, alarm_message
from
table01
where
(Date_time >= '" & DateTimePicker5.Value.ToString("yy/MM/dd HH:mm:ss") & "' )
and (Date_time < '" & DateTimePicker6.Value.ToString("yy/MM/dd HH:mm:ss") & "')
会做到这一点。
注意我已经用简单的比较条件改变了它们
在SQL Server中运行并检查结果:
create table #dateTest (
testDate datetime
)
insert into #dateTest values ('2016-03-01')
select * from #dateTest
declare @fromDate datetime
set @fromDate = '2016-01-01'
declare @toDate datetime
set @toDate = '2016-03-01'
select
testDate
from
#dateTest
where
( testDate between @fromDate and @toDate )
-- 2016-03-01 00:00:00.000
select
testDate
from
#dateTest
where
( testDate <= @fromDate )
and ( testDate < @toDate )
-- No rows selected
drop table #dateTest