VB.net 从 DateTime.Now.ToString 减去 1 年

VB.net Minus 1 year from DateTime.Now.ToString

根据我之前的问题 ,我的 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 没有真的有用。

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

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

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

几件事:

  • 在 .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,而不是将它们嵌入到字符串中时,字符串表示格式变得无关紧要。

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