【问题标题】:VB.net Minus 1 year from DateTime.Now.ToStringVB.net 从 DateTime.Now.ToString 减去 1 年
【发布时间】:2015-11-07 20:14:45
【问题描述】:

根据我之前的问题 VB.net SQL statement to query 1 yr old Timestamp ,我用于回顾一年记录的 SQl 查询在中途停止并出现以下错误:Select Error: ORA-01830: date format picture ends before converting entire input string

因此,我决定对距当前日期不超过一年的行执行不同的路由。

为此,我将在 VB.net 中创建以下 SELECT 语句:

Dim strSearch As String = "Select timestampVal from table_name WHERE timestampVal > " & minusYear & " order by timestampVal DESC"

对于我的 SELECT 语句中的 minusYear 变量,我将首先提取以下当前日期字符串:

Dim sign As String = DateTime.Now.ToString("yyyyMMdd-hhmmss")

但是,要获得minusYear,我需要以某种方式从sign 减去一年。

我试过Dim minusYear As String = DateTime.Now.AddYears(-1);但是它的格式像MM\DD\YYYY HH:MI:SS PM 这样不起作用,因为我需要查询字符串在哪里看起来像yyyyMMdd-hhmmss

有没有办法从我的符号字符串中减去 1 年?我尝试了,但当然存在数据类型问题,并且将字符串转换为 CInt 并不起作用。 p>

如果我可以得到 1 年的减号来得到minusYear,那么我的 select 语句就可以工作了[我已经在 SQL 中对其进行了测试,所以这种方式可以工作,我只需要得到sign's 的值减去一年]

【问题讨论】:

    标签: sql vb.net datetime tostring


    【解决方案1】:

    一些事情:

    • 在 .NET 中,格式字符串区分大小写。您已指定 hh,这是 12 小时制的小时数。您可能是指HH 24 小时制几个小时。

    • DateTime.Now.AddYear(-1) 减去一年要容易得多,但请记住DateTime.Now 是在您服务器的本地时区。在许多情况下,这本身就是一个问题。根据您的数据,您可以考虑使用DateTime.UtcNow,或者可能使用TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz) 转换为特定时区,而不是依赖服务器的时区设置。

    • 确实,您不应该在数据库中将日期或时间存储为varchar。在 oracle 中使用 TIMESTAMP 字段。您遇到的所有格式问题都源于那里。创建新列、迁移数据、更新使用情况并删除旧列。

    • 您也不应该通过字符串连接传递参数。这通常不利于性能(防止缓存执行计划),有时会make your code vulnerable to SQL Injection attacks

    • 当你pass parameters properly on the .NET side,而不是将它们嵌入到字符串中时,字符串表示格式变得无关紧要。

    • 除非在您的应用程序层中存在您需要考虑的特定问题,否则您根本不应该这样做。相反,使用数据库中的函数来计算当前时间并在那里减去一年。将当前时间作为参数发送到您的数据库是没有意义的,因为您的数据库可以自行完成。

    【讨论】:

      【解决方案2】:

      在应用层而不是 SQL 进行操作是一种代码味道。如果可以的话,我会在第一个问题上多坚持一点(接下来我会看看)。但与此同时,要在 VB.NET 中完成...

      Dim sign As String = DateAdd(DateInterval.Year, -1, Now()).ToString("yyyyMMdd-hhmmss")
      

      【讨论】:

      • 我在看到您对字符串格式的评论后进行了更新。现在可以按照您的需要对其进行格式化。然而,这又是一种代码气味。您不应该构建 SQL 查询字符串。如果您创建参数化查询并将参数作为 DateTime 而不是 String 传递,那么您永远不必担心日期的格式。
      • 这确实按我的意愿工作。谢谢。问题是数据库是在我处理应用程序之前预先创建的。该应用程序在日期列中有 1000 多个信息,因此;我必须处理实施了哪些信息。它们看起来都遵循相同的格式;但是,当我尝试在那里执行此操作时,数据库标志阻止了我上面提到的错误。话虽如此,我知道在 VB.net 中应用查询并没有标记错误。因此,即使我更喜欢在数据库中进行查询,我也无法绕过错误。再次感谢您!
      猜你喜欢
      • 2010-12-31
      • 2011-02-14
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 2016-03-13
      相关资源
      最近更新 更多