Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 在几乎正常工作的日期之间选择_Sql Server 2008_Date_Select - Fatal编程技术网

Sql server 2008 在几乎正常工作的日期之间选择

Sql server 2008 在几乎正常工作的日期之间选择,sql-server-2008,date,select,Sql Server 2008,Date,Select,我的问题可能与选择中的日期格式有关 在asp文件中,我打开一个ADO记录集,希望检索介于date1(2013年8月15日)和date2(2013年8月22日)之间的MS SQL表行(即从今天起的前7天) SELECT确实检索了相应的2013行,但也检索了返回到2012年8月15日的行 以下是选择: oRS.Source = "SELECT * FROM aTable WHERE entry_Date BETWEEN '" & resultLowerDate & "' AND '"

我的问题可能与
选择中的日期格式有关

在asp文件中,我打开一个ADO记录集,希望检索介于
date1(2013年8月15日)
date2(2013年8月22日)
之间的MS SQL表行(即从今天起的前7天)

SELECT
确实检索了相应的2013行,但也检索了返回到2012年8月15日的行

以下是选择:

oRS.Source = "SELECT * FROM aTable WHERE entry_Date BETWEEN '" & resultLowerDate & "' AND '" & resultCurrentDate & "' AND entry_Status <> 'INACTIVE'"

关于为什么将
初始08/15/2012
行与满足
选择
查询的其他行一起选中,您有什么想法吗?

停止在VARCHAR列中存储日期!并停止连接字符串,使用正确的参数

很抱歉大喊大叫,但是我们每天都会遇到很多问题,人们使用错误的数据类型是因为一些未知的,可能是愚蠢的原因,这些都是它导致的问题

这里的问题是您正在比较字符串。尝试:

"... WHERE CONVERT(DATETIME, entry_date, 101)" & _
     " >= CONVERT(DATETIME, '" & resultLowerDate & "', 101)" & _
" AND CONVERT(DATETIME, entry_date, 101)" & _
     " < DATEADD(DAY, 1, CONVERT(DATETIME, '" & resultCurrentDate & "', 101))"
“…其中转换(DATETIME,entry_date,101)”和_
“>=转换(日期时间,”&resultLowerDate&“,101)”和_
“和转换(日期时间,输入日期,101)”&_
或者更好的方法是,将resultLowerDate和resultUpperDate设置为YYYYMMDD格式,然后您可以说:

"... WHERE CONVERT(DATETIME, entry_date, 101) >= '" & resultLowerDate & "'" & _
" AND CONVERT(DATETIME, entry_date, 101) < DATEADD(DAY, 1, '" & resultCurrentDate & "'"
“…其中CONVERT(DATETIME,entry_date,101)>=”&resultLowerDate&“”&_
“并转换(DATETIME,entry_date,101)

请注意,我使用了一个开放的范围(>=和),问题在于您的entry\u Date列是一个varchar字段,而不是实际日期。如果在选择期间将其强制转换为datetime,您将得到预期的结果

select *
from aTable
where cast(entry_Date as datetime) between '08/15/2013' and '08/22/2013'

为什么entry\u Date是一个varchar???如果@AaronBertrand不插入他自己的文章,我会的。请阅读和。可能值得一读《踢坏习惯》系列的全部内容。它们都是正确的,如果每个人都阅读它们,关于Stackoverflow的问题就会少很多!如果用户使用SET语言B运行,CAST将无法正常工作RITISH或SET DATEFORMAT DMY。您应该使用带有样式的convert,并且任何未显式转换的字符串文字都应该是ISO格式(YYYYMMDD)。这是真的,我通常会这样做:转换(转换(varchar,entry_Date,101)为datetime),但在本例中省略了它。如果entry_date已经是一个字符串,那么转换为样式为101的varchar()并没有任何作用。(如果语言为英式或dateformat为DMT,则该表达式仍然失败。)为什么不干脆
convert(datetime,entry_date,101)
?我一直使用这种语法来省略日期的时间戳,但我喜欢您的解决方案的简洁性,它应该可以在将来为我节省一些击键(尽管有肌肉记忆)。
选择cast(转换(varchar,'08/15/2013 13:45:26.013',101)为datetime)
产生
2013-08-15 13:45:26.013
(当它没有因为语言或日期格式设置而失败时!)因此,我不确定您是如何以这种方式省略时间戳的。此外,我在这个问题上已经被搁置了一段时间。但是,今天我回顾了您的建议并采纳了您的建议。我已将相应的表列修改为日期和时间类型。@user2033850太好了!迟做总比不做好。:-)
select *
from aTable
where cast(entry_Date as datetime) between '08/15/2013' and '08/22/2013'