VB.net 和 SQL 服务器中的日期和时间格式
Date and Time Formatting in VB.net and SQL Server
我有一个 table,其中数据以 'yy/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"
Table格式如下
**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
您可以使用转换功能。
select
Date_time, alarm_id, alarm_message
from
table01
where
Convert(Datetime,Date_time) between Convert(Datetime,'" & DateTimePicker5.Value & "') and Convert(Datetime,'" & DateTimePicker6.Value & "')
这是一个非常棘手的解决方案。
由于后端保持年份'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 & "'
开始于:
Console.WriteLine(#1/31/2016 10:23:22 AM#.ToString("yy/MM/dd HH:mm:ss"))
returns 2031 年 1 月 16 日 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") & "')
会成功的。
注意我已经用简单的比较条件改变了 between
运行 在 SQL 服务器中查看结果:
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
从来没有 曾经 使用字符串连接将值放入这样的查询中!这几乎是在乞求有一天早上醒来,发现您的网站在六个月前被黑了。
首先您需要做的事情是修复架构,以便您的日期值实际存储为 DateTime 列。造成这种情况的原因太多了,我什至无法一一描述。就去做吧!
完成后,您可以像这样构建查询:
Const SQL As String = _
"SELECT Date_time, alarm_id, alarm_message
FROM table01
WHERE Date_time between @StartTime AND @EndTime"
嘿,看:这是一个常量。现在这不是绝对必要的;我通常只使用普通的 Dim
'd 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
或者,如果您正在填充数据表:
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
请注意,使用此方法,您永远不必担心日期时间格式。 ADO.Net 为您解决。它知道 .Net DateTime 对象,它知道 Sql Server DateTime 列,并且它自然地处理两种类型之间的转换。
我有一个 table,其中数据以 'yy/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"
Table格式如下
**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
您可以使用转换功能。
select
Date_time, alarm_id, alarm_message
from
table01
where
Convert(Datetime,Date_time) between Convert(Datetime,'" & DateTimePicker5.Value & "') and Convert(Datetime,'" & DateTimePicker6.Value & "')
这是一个非常棘手的解决方案。 由于后端保持年份'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 & "'
开始于:
Console.WriteLine(#1/31/2016 10:23:22 AM#.ToString("yy/MM/dd HH:mm:ss"))
returns 2031 年 1 月 16 日 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") & "')
会成功的。
注意我已经用简单的比较条件改变了 between
运行 在 SQL 服务器中查看结果:
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
从来没有 曾经 使用字符串连接将值放入这样的查询中!这几乎是在乞求有一天早上醒来,发现您的网站在六个月前被黑了。
首先您需要做的事情是修复架构,以便您的日期值实际存储为 DateTime 列。造成这种情况的原因太多了,我什至无法一一描述。就去做吧!
完成后,您可以像这样构建查询:
Const SQL As String = _
"SELECT Date_time, alarm_id, alarm_message
FROM table01
WHERE Date_time between @StartTime AND @EndTime"
嘿,看:这是一个常量。现在这不是绝对必要的;我通常只使用普通的 Dim
'd 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
或者,如果您正在填充数据表:
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
请注意,使用此方法,您永远不必担心日期时间格式。 ADO.Net 为您解决。它知道 .Net DateTime 对象,它知道 Sql Server DateTime 列,并且它自然地处理两种类型之间的转换。