我在尝试通过选择2个日期之间的数据来查询我的数据库时遇到了一个真正的问题。
以下是我在VB .NET项目中使用的查询。
WHERE [BuildID] > 0 AND [EndDate] BETWEEN '01/07/2014' and '31/07/2014'
日期格式设置为dd / mm / yyyy,列类型为VARCHAR(10)
当我运行此查询时,它会带回我数据库中的所有数据,基本上它会选择所有数据。
我尝试过几种方法,例如[EndDate] >= '01/07/2014' and [EndDate] <= '31/07/2014'
,它会带来相同的结果,它会忽略日期并带回整个数据库。
我觉得这是因为列设置为VARCHAR但我不确定。
如果有人能指出我最合适的方向。
感谢您花时间阅读本文。
答案 0 :(得分:2)
列类型为
VARCHAR(10)
要将日期视为日期,您需要将列类型设置为date
(如果使用旧版本的SQL,则需要datetime
。
如果您无法控制列类型,则需要转换为日期,但这对于任何可调整大小的数据集都会表现不佳:
WHERE [BuildID] > 0
AND cast([EndDate] as date) BETWEEN '2014-07-01' and '2014-07-31'
注意:我也改变了上面字符串的日期格式 - 这不是必需的,但我希望避免混淆美国和英国格式(如果您的代码由国际团队维护,则特别有用)。
答案 1 :(得分:1)
尝试yyyyMMdd
格式永不失败。您还应该尝试将列转换为DATETIME
。
WHERE [BuildID] > 0 AND CONVERT(DATETIME,[EndDate]) BETWEEN '20140701' and '20140731'
或者如果VB中有变量,那么:
dateVar.ToString("yyyyMMdd")
答案 2 :(得分:1)
答案 3 :(得分:1)
请参阅 Fiddle 了解SQL Server中的日期时间格式
使用类似:
convert(varchar,EndDate,111) BETWEEN '2014/07/01' and '2014/07/31'
因为,varchar会进行字符串比较,并且会以dd / mm / yyyy格式失败。字符串比较最适合yyyy / mm / dd(YearMonthDate)格式。
Example, as per varchar comparison,
31/01/2014 is greater than 01/02/2014
whereas,
2014/01/31 is lesser than 2014/02/01.
答案 4 :(得分:1)
始终始终使用parameterized SQL queries。
Dim date1 As Date = Date.Parse("2014-07-01")
Dim date2 As Date = Date.Parse("2014-07-31")
mycmd.CommandText = ".... WHERE [BuildID] > @bid AND [EndDate] BETWEEN @firstDate AND @lastDate"
mycmd.Parameters.AddWithValue("@bid", 0I)
mycmd.Parameters.AddWithValue("@firstDate", date1)
mycmd.Parameters.AddWithValue("@lastDate", date2)