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 列,并且它自然地处理两种类型之间的转换。