Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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(Teradata)选择数据_Sql_Between_Teradata - Fatal编程技术网

SQL(Teradata)选择数据

SQL(Teradata)选择数据,sql,between,teradata,Sql,Between,Teradata,我有一个关于SQL(特别是teradata)的问题。 我必须生成一天的报告 我怎样才能做到呢 例如,在ms access中,我可以 WHERE DT>=#2011-01-01# and DT<=#2011-0101# 但这种方法并不精确。如何使用ranged WHERE语句指定1天 很抱歉,我没有SQL访问权限,无法测试它;因此,我要求提供专业建议。之间的范围包括在内,因此这可以: DT between '2011-09-01' and '2011-09-01' 是的,这是准确的

我有一个关于SQL(特别是teradata)的问题。 我必须生成一天的报告

我怎样才能做到呢

例如,在ms access中,我可以

WHERE DT>=#2011-01-01# and DT<=#2011-0101#
但这种方法并不精确。如何使用ranged WHERE语句指定1天


很抱歉,我没有SQL访问权限,无法测试它;因此,我要求提供专业建议。

之间的范围包括在内,因此这可以:

DT between '2011-09-01' and '2011-09-01'
是的,这是准确的:)

现在,如果您的
DT
是日期时间字段(不是日期字段),则必须更改方法:

DT >= '2011-09-01' and DT < '2011-09-02'
DT>='2011-09-01'和DT<'2011-09-02'

当选择某个范围(尤其是日期和时间戳)时,最好是选择包含下限的、独占上限的。也就是说,您想要的是
lb=:startDate范围内的内容
和dt<:endDate
(我在系统上输入主机变量的方式是
:variableName
。您必须在teradata上查找主机变量。)

您为between列出的字符串将按原样工作—我认为几乎所有主要的RDBMS都默认识别*ISO格式。

在Teradata中处理日期可能有点棘手

如果DT是一个“timestamp”字段,您可以简单地将其转换为一个日期,因为您只报告一天,所以只需测试是否相等

假设你今天想报道,那么请输入'03/20/2012':

-- Teradata: Select records where DT matches a certain day.
SELECT * -- etc...
WHERE CAST(DT as date) = TO_DATE('03/20/2012', 'mm/dd/yyyy')
MS SQL与此类似:

SELECT * from [webdb].[mediaguide].[fileDirectories]
WHERE CAST('03/20/2012' AS date) = CAST(DT AS date)

从技术上讲,我会使用参数化来传递日期,但你明白了。

简单的答案是:

WHERE DT BETWEEN Date_X AND Date_X + 1
如果你想明确

WHERE DT BETWEEN Date_X AND Date_X + INTERVAL '1' DAY
您可以随时阅读Teradata手册:)


按照他们的手册,x在y和z之间=((x>=y)和(x我的意思是它不是:-\n我可以用DT>='2011-09-01'和DT来表示它不精确吗?基于什么?请定义一个BETWEEN“不精确”的方式,这样我们可以更好地提供帮助。“BETWEEN操作符在不同的数据库中被不同地对待!”你应该知道w3schools不是一个非常可靠的知识来源。看这里:另外,你也应该看这里:另外,分享我的经验,我曾与SQL Server、Oracle、Firebird、Informix、MS Access、MySQL、PostGreSQL合作过(我可能忘记了一些次要的)。绝对没有一个是互斥范围。我想知道你是否正确(@Andrew-什么?你能再解释一下吗?布尔值不是真正的范围-它们只能是
TRUE
false
)(…我忽略null,非常感谢).DT@Andrew-啊,我明白你的意思了。不,我的答案相当于阿德里安发布的答案的第二部分;
:startDate
应该是
'2011-09-01'
:endDate
应该是
'2011-09-02'
,这将选择
2011-09-01
这一天的所有时间。尝试补考包括时间戳在内的每一个界限都是谋杀,因为你必须把所有事情都降低到微秒/纳秒级——从一天的开始开始(通常很琐碎),加上一天,然后得到小于该值的值,这要容易得多。
WHERE DT BETWEEN Date_X AND Date_X + 1
WHERE DT BETWEEN Date_X AND Date_X + INTERVAL '1' DAY