我试图将与某个月份相对应的数据从SQL数据库放入临时表中。
DROP TABLE
#ComPAIR_Alliance_Table
SELECT
IMOno
,period
,[service]
,alliances
INTO
#ComPAIR_Alliance_Table
FROM
com_COMPAIR.dbo.Data_BlueWaterCapacity_US_2
WHERE
LEFT(period, 7) = '2015-03'
SELECT
*
FROM #ComPAIR_Alliance_Table
期间字段采用以下格式:2015-03-29 00:00:00.000
但是,我的代码只返回了一个空的临时表,其中包含正确的列名,但没有行(即使我确定表中存在具有该日期的行)。我已经通过使用is.numeric来确保period列确实是一个字符串。
有人可以帮我解决可能出现的问题吗?
谢谢!
答案 0 :(得分:3)
如果它是日期/日期时间/日期时间2,则可以将其与2015-03
进行比较,例如:
WHERE period >= '2015-03-01'
AND preiod < DATEADD(MONTH, 1, '2015-03-01')
以防万一:
2015-03-31
,2015-03-31 23:59:59
和2015-03-31 23:59:59.9999999
DATEADD
部分不依赖于表行答案 1 :(得分:2)
猜测Period
是date
。如果是这样,请停止将其视为varchar
,不是一个。如果您想要2015年3月以后的值,请执行以下操作:
WHERE period >= '20150301'
AND period < '20150401'
答案 2 :(得分:0)
LEFT做一些奇怪的事情,因为 LEFT导致从Date隐式转换为String 。您可以查看this question以获得更多信息,但是您所得到的正是SQL所要获得的-在行上的联接,其中句点的左7个字符等于'2015-03',这不会发生,因为喜欢与“ Jan 01”之类的东西进行比较
答案 3 :(得分:0)
LEFT
函数需要将您的datetime
列隐式转换为varchar
值才能正常工作。 SQL Server根据其国际化设置选择日期的varchar
格式。在我的服务器上,其Mar 29 2015 12:00AM
和LEFT
产生Mar 29
。这就是为什么它不等于2015-03
的原因。
您应该将列视为日期时间,然后使用有效的日期时间比较执行比较,如下所示:
WHERE period BETWEEN '1/1/2015' AND '1/31/2015'
答案 4 :(得分:-2)
日期存储为日期类型。您可能要尝试
where convert(varchar(20), period,121)
会将其转换为字符串...