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,而不是将它们嵌入到字符串中时,字符串表示格式变得无关紧要。
除非您的应用程序层中有您需要考虑的特定内容,否则您根本不应该这样做。相反,使用数据库中的函数来计算当前时间并在那里减去一年。将当前时间作为参数发送到你的数据库是没有意义的,因为你的数据库可以自己做。
根据我之前的问题 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,而不是将它们嵌入到字符串中时,字符串表示格式变得无关紧要。
除非您的应用程序层中有您需要考虑的特定内容,否则您根本不应该这样做。相反,使用数据库中的函数来计算当前时间并在那里减去一年。将当前时间作为参数发送到你的数据库是没有意义的,因为你的数据库可以自己做。