【发布时间】:2020-03-12 15:13:27
【问题描述】:
我有一个表,其中年份和月份值分别保存为 int 数据类型列 [Year] 和 [Month]。我需要使用 WHERE 子句查询将输出限制在某个日期的表。我想出了一个使用 DATEFROMPARTS 函数的解决方案(避免数据类型的多次转换),它在 SELECT 子句中完美运行(不同日期的数量是有限的,所以我可以检查所有这些),但是当我尝试使用时失败了WHERE 子句中的复合日期。
这样查询
SELECT DISTINCT DATEFROMPARTS([Year], [Month], 1) FROM MyTable
给予
2019-04-01
2019-05-01
2019-06-01
2019-07-01
2019-08-01
2019-09-01
2019-10-01
2019-11-01
2019-12-01
2020-01-01
2020-02-01
2020-03-01
但是当我添加一个像这样的 WHERE 子句时
SELECT DISTINCT DATEFROMPARTS([Year], [Month], 1) FROM MyTable
WHERE DATEFROMPARTS([Year], [Month], 1) < convert(date, getdate(), 23)
或
SELECT DISTINCT DATEFROMPARTS([Year], [Month], 1) FROM MyTable
WHERE DATEFROMPARTS([Year], [MonthNumber], 1) < convert (date, '2019-12-01', 23)
我得到一个错误:
无法构造数据类型日期,某些参数的值无效。
我正在使用 SQL Server 版本。 13
免责声明 数据存储在我从云机器访问的远程 SQL 服务器上。这是一个视图,我对它的权限为零,只能在 ETL 过程中进一步阅读和使用它。 Year 和 Month 列中 no 存在非法值,例如 NULL、Month > 12 等。
更新 我在 SQL Server 2016 上尝试过类似的场景:
CREATE TABLE MyTable(
[Year] [int] NULL,
[Month] [int] NULL)
INSERT INTO MyTable
([Year], [Month])
VALUES
(2019, 9)
,(2019, 10)
,(2019, 11)
,(2019, 12)
,(2020, 1)
,(2020, 2)
,(2020, 3)
,(2020, 4)
DATEFROMPARTS 或连接 dateparts 并转换为不同格式的日期的组合不起作用,充其量,日期仅在 yyyy-mm-dd 格式下看起来不错,但无法与 getdate() 函数进行比较。
@John-Cappelletti 提出的解决方案帮助解决了最初的问题:
try_convert(date, concat([Year],'/',[Month],'/', 1))
虽然我仍然不清楚为什么不能将组合日期转换为不同的日期样式。
【问题讨论】:
-
我假设 SQL Server 版本 13 是指 SQL Server 2016?
-
您能否提供一些可以复制问题的示例数据?
-
根据假定示例数据,我无法复制您的问题。 DB<>Fiddle
-
你想要哪种形式的数据?
-
DDL 和 DML 最好,如果不是表格格式
text。
标签: sql sql-server tsql date