SQL Server 多表连接查询 关于日期DateAdd 和DateDiff

baogaodaren 2017-12-01 01:30:26
SELECT DATEADD(DAY,n-1,'20060101')AS orderdate,
O.orderid,o.custid,O.empid
FROM dbo.Nums
LEFT JOIN Sales.Orders AS O
ON DATEADD(DAY,n-1,'20060101')=O.orderdate
WHERE n<= DATEDIFF(DAY,'20060101','20081231')+1
ORDER BY orderdate

&

SELECT DATEADD(DAY,n-1,'20060101')AS orderdate,
O.orderid,o.custid,O.empid
FROM dbo.Nums
LEFT JOIN Sales.Orders AS O
ON n=DATEDIFF(DAY,o.orderdate,'20081231')
WHERE n<= DATEDIFF(DAY,'20060101','20081231')+1
ORDER BY orderdate


返回了两个不同的结果视图,这两种计算方法有什么不同
...全文
186 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
baogaodaren 2017-12-01
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
ON DATEADD(DAY,n-1,'20060101')=O.orderdate  --在20060101的基础上加上n-1天=O.orderdate
ON n=DATEDIFF(DAY,o.orderdate,'20081231') --20081231和o.orderdate的天数差=n
谢谢
baogaodaren 2017-12-01
  • 打赏
  • 举报
回复
引用 2 楼 RINK_1 的回复:
当n>=1时,第一个是以20060101为基准日期进行递增和orderdate进行比较,而第二个则是以20081231为基准进行递减和orderdate比较。这两个逻辑如果n相同时,O.orderdate肯定不同,而O.orderdate相同时,那n又不同,所以最终结果集是不同的。
谢谢
baogaodaren 2017-12-01
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
ON DATEADD(DAY,n-1,'20060101')=O.orderdate  --在20060101的基础上加上n-1天=O.orderdate
ON n=DATEDIFF(DAY,o.orderdate,'20081231') --20081231和o.orderdate的天数差=n
在第二句上修改为 ON n=DATEDIFF(DAY,o.orderdate,'20081231')+1的话 输出的结果集还是不同 下面是第二种修改后的部分结果 orderdate orderid custid empid 2006-07-06 00:00:00.000 NULL NULL NULL 2006-07-07 00:00:00.000 NULL NULL NULL 2006-07-08 00:00:00.000 NULL NULL NULL 2006-07-09 00:00:00.000 NULL NULL NULL 而按照第一种的结果来算的话 orderdate orderid custid empid 2006-07-06 00:00:00.000 NULL NULL NULL 2006-07-07 00:00:00.000 NULL NULL NULL 2006-07-08 00:00:00.000 10250 34 4 2006-07-08 00:00:00.000 10251 84 3 2006-07-09 00:00:00.000 10252 76 4 是不是因为第二种算法以n过滤,n在数字辅助表中只出现一次所以只会出现一次值 ,而第一种算法以orderdate为过滤,orderdate在表中出现多次则会有第二种结果
RINK_1 2017-12-01
  • 打赏
  • 举报
回复
当n>=1时,第一个是以20060101为基准日期进行递增和orderdate进行比较,而第二个则是以20081231为基准进行递减和orderdate比较。这两个逻辑如果n相同时,O.orderdate肯定不同,而O.orderdate相同时,那n又不同,所以最终结果集是不同的。
二月十六 2017-12-01
  • 打赏
  • 举报
回复
ON DATEADD(DAY,n-1,'20060101')=O.orderdate  --在20060101的基础上加上n-1天=O.orderdate
ON n=DATEDIFF(DAY,o.orderdate,'20081231') --20081231和o.orderdate的天数差=n

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧