Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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上DATETIME2(2)的最小值和最大值_Sql_Sql Server - Fatal编程技术网

返回SQL Server上DATETIME2(2)的最小值和最大值

返回SQL Server上DATETIME2(2)的最小值和最大值,sql,sql-server,Sql,Sql Server,在我的一个视图中,我想返回两个额外的列ValidFrom和ValidTill。根据情况,如果左联接找到了什么,我想返回该值,或者返回所用数据类型的最小/最大值,即DATETIME2(2) 现在,我正在使用以下代码: SELECT ISNULL(h.Arrival, CAST('0001-01-01 00:00:00.00' AS DATETIME2(2))) AS ValidFrom, ISNULL(h.Departure, CAST('9999-12-31 23:59:59.99' A

在我的一个视图中,我想返回两个额外的列
ValidFrom
ValidTill
。根据情况,如果
左联接
找到了什么,我想返回该值,或者返回所用数据类型的最小/最大值,即
DATETIME2(2)

现在,我正在使用以下代码:

SELECT
  ISNULL(h.Arrival, CAST('0001-01-01 00:00:00.00' AS DATETIME2(2))) AS ValidFrom,
  ISNULL(h.Departure, CAST('9999-12-31 23:59:59.99' AS DATETIME2(2))) AS ValidTill
FROM MyTable m
LEFT JOIN MyOtherTable h ON m.ID = h.ID

是否有更好的方法获取最小值和最大值?我不喜欢当前的硬编码版本。

我将在我的评论中举例说明,因为这在另一个版本中不适合/显示,但我将在下面引用它们,以防它们被删除。我最初的反应


NULL
,在我看来,这似乎是正确的值
ValidTill
值为
NULL
意味着它是“当前”值,此时没有结束有效日期。我还假设
ValidFrom
的值为
NULL
意味着它始终有效

然后是我关于在之间使用的答复:


考虑到你的价值观中有时间部分,不要在@Andréreichlet之间使用
,它可能不会总是给出你想要的结果(
2019-11-13 00:00:00.01
不在
20191101
20191113
之间)。在我看来,使用
=
NULL
似乎是这里的正确值
ValidTill
值为
NULL
意味着它是“当前”值,此时没有结束有效日期。我还假设
ValidFrom
的值为
NULL
意味着它始终是有效的。由于SQL Server不支持
无限
,您必须硬编码(或保留NULL)您可以安全地删除强制转换,因为ISNULL会将第二个参数转换为第一个参数的数据类型。考虑到您有值的时间部分,不要在
@Andréreichlet之间使用
,它可能不会始终提供您想要的结果(例如,
2019-11-13 00:00:00.01
不在
20191101
20191113
之间)。使用
=
原始问题的答案是“否”顺便说一句,没有T-SQL函数能够给出最小值和最大值,就像.NET中的
DateTime.MinValue
DateTime.MaxValue
那样(当然,您可以为相同的函数生成CLR函数,但这太过分了)。事实上,T-SQL缺少这些值的实际类型化文本,这意味着从字符转换是不可避免的。任何试图巧妙处理这一点的尝试通常都会导致表达式无法优化。
WHERE a.Checkdate >= b.ValidFrom
  AND a.CheckDate < b.ValidTill
WHERE (a.Checkdate >= b.ValidFrom OR b.ValidFrom IS NULL)
  AND (a.CheckDate < b.ValidTill OR B.ValidTill IS NULL)