Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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:我的日期数据有什么问题?_Sql_Sql Server_Tsql - Fatal编程技术网

sql server:我的日期数据有什么问题?

sql server:我的日期数据有什么问题?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个带有日期的列,但它是一个varchar: 8/31/2010 9:48 8/31/2010 9:49 8/31/2010 9:51 8/31/2010 9:52 8/31/2010 9:55 8/31/2010 9:59 8/31/2010 10:11 8/31/2010 10:13 8/31/2010 10:16 8/31/2010 10:37 8/31/2010 10:42 我确保所有这些都不会是糟糕的约会: SELECT * FROM qcvalues.dbo.batchinfo

我有一个带有日期的列,但它是一个varchar:

8/31/2010 9:48
8/31/2010 9:49
8/31/2010 9:51
8/31/2010 9:52
8/31/2010 9:55
8/31/2010 9:59
8/31/2010 10:11
8/31/2010 10:13
8/31/2010 10:16
8/31/2010 10:37
8/31/2010 10:42
我确保所有这些都不会是糟糕的约会:

SELECT *
FROM qcvalues.dbo.batchinfo
WHERE ISDATE(reporttime) <> 1
我得到了这个错误

Msg 241, Level 16, State 1, Line 2
Conversion failed when converting date and/or time from character string.

我的转换有什么问题?

在查询之前放置SET-DATEFORMAT MDY。

在查询之前放置SET-DATEFORMAT MDY。

如果需要存储日期,则以后使用datetime列

这行吗

WHERE CONVERT(DATE,RTRIM(reporttime))
BETWEEN '2010-08-01' and '2010-08-31' 
如果没有,请在运行SET-DATEFORMAT MDY之前使用它

如果您必须将其存储在varchar列中,则使用YYYYMMDD格式…您可以这样做


其中reporttime(如“201008%”如果您希望在2010年8月存储日期,则在将来使用datetime列

这行吗

WHERE CONVERT(DATE,RTRIM(reporttime))
BETWEEN '2010-08-01' and '2010-08-31' 
如果没有,请在运行SET-DATEFORMAT MDY之前使用它

如果您必须将其存储在varchar列中,则使用YYYYMMDD格式…您可以这样做

如果你想在2010年8月观看像“201008%”这样的reporttime,请记住,这组“2010-08-31”作为datetime的演员的时间部分为00:00

考虑将您的varchar数据转换为smalldatetime,并具体说明两者之间的时间界限。无需转换、子字符串等。只需一次转换即可

将此视为一个潜在的解决方案:

SELECT rowid from qcvalues.dbo.batchinfo 
WHERE CAST(reporttime as smalldatetime)
BETWEEN '2010-08-01' AND '2010-08-31 23:59'
请记住,这个演员的“2010-08-31”作为日期时间将有其时间部分为00:00

考虑将您的varchar数据转换为smalldatetime,并具体说明两者之间的时间界限。无需转换、子字符串等。只需一次转换即可

将此视为一个潜在的解决方案:

SELECT rowid from qcvalues.dbo.batchinfo 
WHERE CAST(reporttime as smalldatetime)
BETWEEN '2010-08-01' AND '2010-08-31 23:59'

这也将去掉时间部分

select rowid 
    from qcvalues.dbo.batchinfo 

    Where cast(floor(cast(cast(reportTime as datetime)as float))as datetime)

     between    cast('2010-08-01' as datetime)
     and        cast('2010-08-31' as datetime)

这也将去掉时间部分

select rowid 
    from qcvalues.dbo.batchinfo 

    Where cast(floor(cast(cast(reportTime as datetime)as float))as datetime)

     between    cast('2010-08-01' as datetime)
     and        cast('2010-08-31' as datetime)

这将解决您的问题:

select rowid
from qcvalues.dbo.batchinfo
where
   CONVERT(DATE, reporttime, 101) >= '20100801'
   -- style 101, not 103
   -- also notice date conversion invariant format YYYYMMDD with no separators
   AND CONVERT(DATE, reporttime, 101) < '20100901'
   -- using BETWEEN with an end date of '8/31/2010' will skip
   --   times between '8/31/2010 00:00:00.003' and '8/31/2010 23:59:59.997'

这将解决您的问题:

select rowid
from qcvalues.dbo.batchinfo
where
   CONVERT(DATE, reporttime, 101) >= '20100801'
   -- style 101, not 103
   -- also notice date conversion invariant format YYYYMMDD with no separators
   AND CONVERT(DATE, reporttime, 101) < '20100901'
   -- using BETWEEN with an end date of '8/31/2010' will skip
   --   times between '8/31/2010 00:00:00.003' and '8/31/2010 23:59:59.997'

为什么要使用从1到字符串长度的substring函数?您是否打算在空格分隔符处将其截断?您也可以不将任何内容转换为日期reporttime>'8/1/2010'和reporttime<'8/31/2010'而直接进行字符串比较。谁把101而不是103放在了正确的位置,但他们删除了答案为什么您在第一部分使用日期,而在两者之间使用日期时间短语这并不重要,但一致性很好。@Beth这是错误的。尝试以下操作:选择“8/20/2010”介于“8/2/2010”和“8/3/2010”之间时的大小写,然后选择“1”或“0”结束为什么要使用从1到字符串长度的子字符串函数?您是否打算在空格分隔符处将其截断?您也可以不将任何内容转换为日期reporttime>'8/1/2010'和reporttime<'8/31/2010'而直接进行字符串比较。谁把101而不是103放在了正确的位置,但他们删除了答案为什么您在第一部分使用日期,而在两者之间使用日期时间短语这并不重要,但一致性很好。@Beth这是错误的。试试这个:当“2010年8月20日”介于“2010年8月2日”和“2010年8月3日”之间时,选择一个案例,然后选择另外一个0结束,真的吗?但它并不是甲骨文最新功能的竞争对手。在我们的领域里,我们需要这个功能。因为,我总是喜欢。。。这是121号还是112号,甚至是104号?哇,真的吗?但它并不是甲骨文最新功能的竞争对手。在我们的领域里,我们需要这个功能。因为,我总是喜欢。。。这是121号还是112号,甚至是104号?就我个人而言,我更喜欢reporttime>='2010-08-01'和reporttime<'2010-09-01',我更喜欢reporttime>='2010-08-01'和reporttime<'2010-09-01'。+1000000如果需要存储日期,则在将来使用datetime列+1000000如果需要存储日期,则在将来使用datetime列