我有以下代码用于在SSRS中进行报告。
create table #tempdata(computer_name varchar(max),[Machine Type] varchar(max),Service_tag varchar(max),
[Operating System] varchar(max),
Computer_Model varchar(max), [Technical YES/NO] varchar(10),Manufacturer varchar(max),[SSD or HDD or null] varchar(max),
HDD_Size int,AD_site varchar(max),AD_Zone varchar(max), firstpowerondate date,FBODY varchar(max),manufacturer_date date,capacity int,
BIOS_version varchar(max),biosreleasedate date, BIOSY int,snapshotdate date)
--select * from SCCM_PCrefreshdata
insert into #tempdata
SELECT DISTINCT
v_R_System.Netbios_Name0 AS Computer_Name,
case
when v_GS_COMPUTER_SYSTEM.Model0 like '%Virtual%' then 'Virtual Machine'
when v_GS_COMPUTER_SYSTEM.Model0 like '%VM%' then 'Virtual Machine'
else 'Physical Machine'
End as 'Machine Type',
Tag0 as Service_Tag,
CASE
When Operating_System_Name_and0 like '%6.1%' then 'Windows 7'
When Operating_System_Name_and0 like '%6.3%' then 'Windows 8.1'
When Operating_System_Name_and0 like '%10%' then 'Windows 10'
END as 'Operating System',
v_GS_COMPUTER_SYSTEM.Model0 AS Computer_Model,
case
when v_GS_COMPUTER_SYSTEM.Model0 like '%precision%' and v_GS_COMPUTER_SYSTEM.manufacturer0 like '%dell%' then 'YES'
else 'NO' END as 'Technical YES/NO',
v_GS_COMPUTER_SYSTEM.manufacturer0 AS Manufacturer,
CASE
when v_GS_DISK.PNPDeviceID0 like '%SSD%' then 'SSD'
when v_GS_DISK.Model0 like '%SanDisk%' then 'SSD'
when v_GS_DISK.Model0 like '%hynix%' then 'SSD'
when v_GS_DISK.Model0 like '%LITEON%' then 'SSD'
when v_GS_DISK.Model0 like '%KINGSTON%' then 'SSD'
when v_GS_DISK.Model0 like '%MICRON%' then 'SSD'
when v_GS_DISK.Model0 like '%NVMe%Device%' then 'SSD'
when v_GS_DISK.Model0 like '%Crucial%' then 'SSD'
when v_GS_DISK.Model0 like '%TOSHIBA KSG60ZM%' then 'SSD'
when v_GS_DISK.Model0 like '%TOSHIBA THNSNK%' then 'SSD'
when v_GS_DISK.PNPDeviceID0 is null then 'null'
else 'HDD' END as 'SSD or HDD or null',
HDISK.size0 AS HDD_Size,
[AD_Site],
[AD_Zone],
CHASSIS.FirstPowerOnDate0 as First_Power_On_Date,
CASE
When FirstPowerOnDate0 is null then '1900'
When FirstPowerOnDate0 like '%2011%' then '2011'
When FirstPowerOnDate0 like '%2012%' then '2012'
When FirstPowerOnDate0 like '%2013%' then '2013'
When FirstPowerOnDate0 like '%2014%' then '2014'
When FirstPowerOnDate0 like '%2015%' then '2015'
When FirstPowerOnDate0 like '%2016%' then '2016'
When FirstPowerOnDate0 like '%2017%' then '2017'
When FirstPowerOnDate0 like '%2018%' then '2018'
When FirstPowerOnDate0 like '%2019%' then '2019'
End as 'FPODY',
CHASSIS.ManufactureDate0 as Manufacturer_Date,
MEMORY.Capacity,
SMBIOSBIOSVersion0 As BIOS_VERSION,
ReleaseDate0 AS BIOS_RELEASE_DATE,
CASE
When ReleaseDate0 is null then '1900'
When ReleaseDate0 like '%2008%' then '2008'
When ReleaseDate0 like '%2009%' then '2009'
When ReleaseDate0 like '%2010%' then '2010'
When ReleaseDate0 like '%2011%' then '2011'
When ReleaseDate0 like '%2012%' then '2012'
When ReleaseDate0 like '%2013%' then '2013'
When ReleaseDate0 like '%2014%' then '2014'
When ReleaseDate0 like '%2015%' then '2015'
When ReleaseDate0 like '%2016%' then '2016'
When ReleaseDate0 like '%2017%' then '2017'
When ReleaseDate0 like '%2018%' then '2018'
When ReleaseDate0 like '%2019%' then '2019'
End as 'BIOSY',NULL
FROM [CM_CAS].[dbo].[v_R_System]
LEFT JOIN (
SELECT ResourceID, Model0, FirstPowerOnDate0, ManufactureDate0, Tag0 FROM [CM_CAS].[dbo].[v_GS_DELL_DCIM_Chassis0] WHERE [CM_CAS].[dbo].[v_GS_DELL_DCIM_Chassis0].CreationClassName0 = 'DCIM_Chassis'
) as CHASSIS ON [CM_CAS].[dbo].[v_R_System].ResourceID = CHASSIS.[ResourceID]
LEFT JOIN [CM_CAS].[dbo].[v_GS_PC_BIOS] ON [CM_CAS].[dbo].[v_GS_PC_BIOS].ResourceID = [CM_CAS].[dbo].[v_R_System].ResourceID
LEFT JOIN (
SELECT ResourceID, SUM(Capacity0) as Capacity From [CM_CAS].[dbo].[v_GS_PHYSICAL_MEMORY] GROUP BY ResourceID
) as MEMORY ON MEMORY.ResourceID = [CM_CAS].[dbo].[v_R_System].ResourceID
LEFT JOIN (
SELECT ResourceID, size0 FROM [CM_CAS].[dbo].[v_GS_DISK]
WHERE [v_GS_DISK].Name0 = '\\.\PHYSICALDRIVE0'
) as HDISK ON HDISK.ResourceID = [CM_CAS].[dbo].[v_R_System].ResourceID
LEFT JOIN (
SELECT ResourceID FROM [CM_CAS].[dbo].[v_GS_LOGICAL_DISK] WHERE [v_GS_LOGICAL_DISK].Caption0 = 'c:'
) as LDISK ON [CM_CAS].[dbo].[v_R_System].ResourceID = LDISK.ResourceID
JOIN v_GS_DISK ON v_R_System.ResourceID = v_GS_DISK.ResourceID
JOIN totalrpt.AD_Computer ON totalrpt.AD_Computer.AD_name = v_R_System.Netbios_Name0
left JOIN v_GS_COMPUTER_SYSTEM ON v_GS_COMPUTER_SYSTEM.ResourceID = v_R_System.ResourceID
WHERE Operating_System_Name_and0 NOT LIKE '%Server%'
and v_gs_disk.model0 not like '%usb%'
and v_gs_disk.model0 not like '%sdhc%'
--and MEMORY.Capacity<8192
--and BIOSY <2017
ORDER BY netbios_name0
create table #temp(computer_name varchar(max),[Machine Type] varchar(max),Service_tag varchar(max),
[Operating System] varchar(max),
Computer_Model varchar(max), [Technical YES/NO] varchar(10),Manufacturer varchar(max),[SSD or HDD or null] varchar(max),
HDD_Size int,AD_site varchar(max),AD_Zone varchar(max), firstpowerondate date,FBODY varchar(max),manufacturer_date date,capacity int,
BIOS_version varchar(max),biosreleasedate date, BIOSY int,snapshotdate date)
insert into #temp
select * from #tempdata
declare @date as date
set @date=replace(convert(NVARCHAR, getdate(), 111), ' ', '/')
update #temp set snapshotdate=@date
insert into SCCM_PCrefreshdata
select * from #temp
drop table #temp
drop table #tempdata
我将日期更新为
declare @date as date
set @date=replace(convert(NVARCHAR, getdate(), 111), ' ', '/')
update #temp set snapshotdate=@date
即使以以下格式更新了给定快照日期之后 2019-03-11,根据我要获取的SSR报告格式,是
所以我需要更改一种格式以获取数据库中的数据,它存储为“-”而不是“ /”
答案 0 :(得分:1)
您对影响您的问题的Sql Server和SSRS中的日期有一些误解。
首先,您已将快照日期声明为日期:snapshotdate date
。这意味着它在SQL Server中存储为日期类型列。您声明:
我需要yyyy-mm-dd格式的日期,即存储在数据库中的日期。
否,yyyy-mm-dd
不是日期在数据库中的存储方式。日期实际上在Sql Server中存储为两个整数,一个是日期,另一个是时间。提取数据时,Sql Server Management Studio会以yyyy-mm-dd
格式表示的日期字符串形式显示该数据,因为这两个整数对运行查询的人员没有任何意义,并且年月日优先级可以绕开由于国际日期格式不同,导致用户误解。
第二,使用以下转换将当前日期放入@date
字段中:
declare @date as date
set @date=replace(convert(NVARCHAR, getdate(), 111), ' ', '/')
让我们忽略以下事实:转换类型111
没有空格,因此您的replace
函数是多余的,因为该格式已经是yyyy/mm/dd
(没有空格)。您的公式从getdate()
获取当前日期,将其转换为yyyy/mm/dd
格式的字符串,执行多余的replace
函数,得到与以前完全相同的字符串,表示日期为strng格式yyyy/mm/dd
。然后-这是重要的一点-因为@date
是日期而不是字符串,所以Sql Server会将您创建的字符串隐式转换回日期(如我们所讨论的,它不是日期)以yyyy/mm/dd
的形式存储为字符串,但为两个整数)。
您无缘无故地进行了所有字符串转换。目前,您上面的公式与以下内容完全相同:
SET @date = GetDate()
第三,您将日期存储与日期显示混淆了。要在表中获取日期,您要做的就是将getdate()
分配给snapshotdate
,而不是NULL
语句中当前在该位置的INSERT
占位符。无需更新语句来更新snapshotdate
,只需将其与其余数据一起插入即可,表中将存储正确的当前日期。
第四,演示文稿最好与存储区分开来,因此日期的显示方式与存储方式无关。 Sql Server Management Studio将其表示为yyyy-mm-dd
,如果在此列中更新此字符串,则在数据库中更新该行时,它将隐式转换回日期类型。
SSRS将默认使用系统定义的短日期格式来显示日期-对于您来说,它看起来像MM/dd/yyyy hh:mm:ss tt
。现在,如果要以不同的方式显示它,则只需要在表示层(SSRS)中以不同的方式设置其格式,而不用担心存储层(Sql Server)。
在表格单元格的属性中,有一个Format
属性用于此目的。分配表格单元格,将其Value
属性设置为snapshotdate
,并将Format
属性设置为yyyy-MM-dd
,日期将以您想要的方式显示。
答案 1 :(得分:0)
您可以使用文本框属性在SSRS中更改日期格式,然后选择日期和所需的格式。它应该选择mm / dd / yyyy,但如果没有,则可以输入。