【问题标题】:Date and Time Formatting in VB.net and SQL ServerVB.net 和 SQL Server 中的日期和时间格式
【发布时间】:2017-01-10 02:37:27
【问题描述】:

我有一个表格,其中的数据以 '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"

表格采用以下格式

  **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 

【问题讨论】:

  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入
  • 你需要检查时间部分吗?还是日期就够了?
  • 我需要日期和时间两者都记录在SQL表中,如下所述格式16/08/29 19:12:25 STB-1 Master-1 Humidity. Low
  • 你会得到日期和时间。我的意思是在 where 条件下,我们只能检查不包括 time 之间的日期部分。
  • 不,我还需要检查日期和时间,只需告诉我如何在查询中选择 Date_time、alarm_id、alarm_message from table01 where Date_time between '" & DateTimePicker5.Value & "' 和'" & DateTimePicker6.Value & "'

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


【解决方案1】:

从来没有EVER使用字符串连接将值放入这样的查询中!一天早上醒来,发现您的网站在 6 个月前被黑客入侵,简直是在乞求。

您需要做的第一件事是修复架构,以便您的日期值实际上存储为 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

请注意,使用此方法,您永远不必担心您的 DateTime 格式。 ADO.Net 为您解决。它知道 .Net DateTime 对象,它知道 Sql Server DateTime 列,它自然地处理这两种类型之间的转换。

【讨论】:

    【解决方案2】:

    这是一个棘手的解决方案。 由于年份在后端保留为“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】:

    您可以使用转换功能。

    select 
        Date_time, alarm_id, alarm_message 
    from 
        table01 
    where 
        Convert(Datetime,Date_time) between Convert(Datetime,'" & DateTimePicker5.Value & "') and Convert(Datetime,'" & DateTimePicker6.Value & "')
    

    【讨论】:

    • 我收到此错误将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
    【解决方案4】:

    自:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      相关资源
      最近更新 更多