根据我之前的问题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}}值减去一年]
答案 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")