【发布时间】:2019-04-10 12:22:41
【问题描述】:
我正在使用 SQL 脚本在 SQL Server 2014 Management Studio 中工作。
我的问题:我有 2 个返回日期时间的变量,即 2019-04-01 00:00:00.000,我正在尝试将这些变量添加到 SQL 字符串中,但是当我这样做时,格式会丢失并被转换至此:2019 年 4 月 1 日上午 12:00。该格式的日期在我的 SQL 脚本中不起作用
我尝试了多个转换和转换代码,但它根本不起作用,下面是我在 @InvoiceTrue 变量上得到的结果:
left join table1 payment on l.LedgerID = payment.LedgerID
left join table2 i on payment.InvoiceID = i.InvoiceID
where l.BusinessDate between 'Apr 1 2019 12:00AM' and 'Apr 7 2019 12:00AM'
order by l.LedgerID
如果您看上面,日期时间格式会丢失。
这是我的 SQL 代码:
Declare
@innerBeginDate datetime = '2019-04-01'
, @innerEndDate datetime = '2019-04-07'
, @InvoiceTrue varchar(max)
Select @InvoiceTrue = N'
left join table1 payment on l.LedgerID = payment.LedgerID
left join table2 i on payment.InvoiceID = i.InvoiceID
where l.BusinessDate between ''' + CAST(@innerBeginDate as varchar) + ''' and ''' + CAST(@innerEndDate as varchar) + ''' order by l.LedgerID'''
select @InvoiceTrue
在将参数传递到字符串后,我需要保持相同的日期时间格式,使其始终像 2019-04-01 00:00:00.000。我做错了什么?
【问题讨论】:
-
您使用的是动态 SQL 吗?从您的问题中不清楚您要做什么。无论如何,假设您需要将日期时间格式化为字符串,只需检查您需要哪种格式的参考文档docs.microsoft.com/en-us/sql/t-sql/functions/…
-
有什么理由需要使用
dynamic query? -
我正在使用动态查询来减少 sql 行代码,因为稍后我正在做一个 if 条件,我将 @InvoiceTrue 变量的结果添加到另一个 sql 字符串
-
要改掉的坏习惯 - 声明没有长度的字符串(例如,“cast (... as varchar)”。
-
要改掉的坏习惯 - 将日期(和相关数据类型)转换为没有样式的 varchar 会产生不一致的输出,因为它取决于运行时设置。因此,请始终指定一种可以根据您的目标正确解释的样式。在此处阅读 Tibor 对 datetime datatype 的详尽讨论 - 是的,请阅读 - 没有 tl/dr.
标签: sql sql-server