VB.net和SQL Server中的日期和时间格式

时间:2016-09-02 05:00:57

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

我有一张表格,其中记录了数据&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 

4 个答案:

答案 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