VB.net减去1年,来自DateTime.Now.ToString

时间:2015-11-07 20:14:46

标签: sql vb.net datetime tostring

根据我之前的问题VB.net SQL statement to query 1 yr old Timestamp,我的SQl查询回顾一年的记录会因为以下错误而中途停止:Dim strSearch As String = "Select timestampVal from table_name WHERE timestampVal > " & minusYear & " order by timestampVal DESC"

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

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

minusYear

对于我的SELECT语句中的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格式相同,因为我需要查询字符串的位置CInt,因此无法工作。

有没有办法从我的签名字符串中减去1年?我尝试但当然有数据类型问题并将字符串转换为minusYear并不是真的工作

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

2 个答案:

答案 0 :(得分:3)

一些事情:

  • 在.NET中,格式字符串区分大小写。您已指定hh,即12小时制的小时数。你可能在24小时制中花费数小时HH

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

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

答案 1 :(得分:1)

在app层而不是SQL上进行操作是一种代码味道。如果可以,我会继续坚持第一个问题(接下来我会看一下)。但与此同时,要在VB.NET中做到这一点......

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